引用计数的库实现 类
library implementation for reference counting classes
我有一个 class 像这样:
Texture
{
int ID
public:
Texture(std::string name){ ID = make_texture(name); }
~Texture(){ delete_texture(ID); }
};
但问题是,当我移动 class 时,析构函数被调用,因此 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
但真正好的是 class 我可以继承自:
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 库中是否存在像这样方便的 class?或者在不实现我自己的引用计数的情况下实现此目标的最佳方法是什么。
扩展我的评论。您需要 Texture
个对象共享对同一个 ID
的引用,因此 ID
需要包装在某种引用计数类型中以便 Texture
保存。这正是 std::shared_ptr
的用例。您所需要的只是一个 custom deleter,它将 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;
}
}
{}
};
就是这样。 Texture
的 copy/move/dtor 现在可以由编译器隐式生成,因为它依赖于 std::shared_ptr
.
的正确行为
我有一个 class 像这样:
Texture
{
int ID
public:
Texture(std::string name){ ID = make_texture(name); }
~Texture(){ delete_texture(ID); }
};
但问题是,当我移动 class 时,析构函数被调用,因此 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
但真正好的是 class 我可以继承自:
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 库中是否存在像这样方便的 class?或者在不实现我自己的引用计数的情况下实现此目标的最佳方法是什么。
扩展我的评论。您需要 Texture
个对象共享对同一个 ID
的引用,因此 ID
需要包装在某种引用计数类型中以便 Texture
保存。这正是 std::shared_ptr
的用例。您所需要的只是一个 custom deleter,它将 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;
}
}
{}
};
就是这样。 Texture
的 copy/move/dtor 现在可以由编译器隐式生成,因为它依赖于 std::shared_ptr
.