首页 > 解决方案 > 引用计数类的库实现

问题描述

我有这样的课:

Texture
{
    int ID
public:
    Texture(std::string name){ ID = make_texture(name); }
    ~Texture(){ delete_texture(ID); }
};

但问题是,当我移动类时,会调用析构函数,因此 ID 现在无效。

我目前的实现将是这样的:

Texture
{
    static std::unordered_map<int> m;
    int ID
public:
    Texture(std::string name){
        ID = make_texture(name);
        m[ID]++;
    }
    Texture(Texture& obj){ *this = obj; }
    Texture &operator=(Texture& obj){
        ID = obj.ID;
        m[ID]++;
    }
    ~Texture(){
        if (!--m[ID])
            delete_texture(ID);
    }
};
//was coded in stack overflow so syntax may be a bit off

但真正好的是我可以继承的类:

Texture : public ref_count<int>
{
    int ID
public:
    Texture(std::string name){ ID = make_texture(name); }
    key(){return ID;} // inherited from ref_count
    on_delete(){ delete_texture(ID); } // inherited from ref_count
};

所以我的问题是:标准/boost 库中是否存在这样的便捷类?或者在不实现我自己的引用计数的情况下实现这一目标的最佳方法是什么。

标签: c++booststdreference-counting

解决方案


扩展我的评论。您需要Texture将对象共享到相同ID的引用,因此ID需要将其包装在某种引用计数类型中Texture以保存。这正是std::shared_ptr. 您所需要的只是一个自定义删除器,它将delete_texture作为释放托管整数的一部分。

class Texture
{
    std::shared_ptr<int> ID;
public:
    Texture(std::string name) :
      ID{ new int(make_texture(name)),
          [](int* id_ptr) {
            delete_texture(*id_ptr);
            delete id_ptr;
          }
        }
    {}
};

就是这样。的 copy/move/dtorTexture现在可以由编译器隐式生成,因为它依赖于std::shared_ptr.


推荐阅读