在我的资源管理器中,createTexture方法应产生一个指向纹理的指针。我想在只有管理员拥有资源的情况下删除该资源。我该如何实现?如果我使用shared_ptr,资源管理器将把其shared_ptr指针存储到纹理,并且将无法删除它。
class ResourceManager
{
vector<shared_ptr<Texture>> _textres;
public:
shared_ptr<Texture> CreateTexture()
{
auto tex = shared_ptr<Texture>(new Texture);
_textures.push_back(tex);
return tex;
}
}
int main
{
ResourceManager rm;
{
auto tex = rm.CreateTexture();
// Do something with texture...
}
// Problem here: ResourceManager doesn't remove the texture because he owns it
}
答案 0 :(得分:2)
我认为您要的是一个requests.packages.urllib3.contrib.pyopenssl.extract_from_urllib3()
,当计数减为1时调用一个回调。您的经理在创建智能指针时在shared_ptr
函数中注册了该回调然后检查每当有人减少引用计数时是否调用它。
需要注意的情况:计数从1开始,然后您不想删除它。
比较侵入式引用计数的智能指针的C++ FAQ's implementation作为起点。您要做的工作是添加CreateTexture()
或其他可调用的对象,以在正确的时间调用。
实施智能指针可能会有些棘手,尤其是在混合使用线程时,但是对于其他起点,您可以比较boost::shared_ptr
(已标准化)和Loki的{{ 3}},在Alexandrescu的经典现代C ++设计中进行了描述。
重新实现std::function
的另一种方法是使用其自定义删除器来调用回调,但是您必须玩一些游戏才能使之工作。
答案 1 :(得分:2)
您需要的是:
weak_ptr
代替shared_ptr
的向量shared_ptr
的删除函数(在范围内没有其他非弱引用时调用)在向量中查找对象并删除该条目可以使用shared_ptr
构造函数提供自定义删除器。确保确实也执行删除操作,因为该行为将不再是自动的。
还要注意some confusions with respect to weak_ptr
behaviour during deleter invocation;您总是可以switch to a raw pointer instead取得基本相同的效果,而无需担心任何问题。
请注意,此更改使您的管理者不再“拥有”纹理,但是根据您所描述的语义(“仅当管理者拥有时才删除资源” ),它实际上从未真正使用过。 / p>