在我的资源管理器中,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
}
最佳答案
您需要的是:
weak_ptr
的shared_ptr
的 vector shared_ptr
,其删除函数(在范围内没有其他非弱引用时调用)在 vector 中查找对象并删除该条目可以使用
shared_ptr
构造函数提供自定义删除器。确保确实也执行删除操作,因为该行为将不再是自动的。也要注意some confusions with respect to
weak_ptr
behaviour during deleter invocation;您可以始终使用switch to a raw pointer instead,它基本上具有相同的效果,而没有任何令人头疼的问题。请注意,此更改使您的管理者不再“拥有”纹理,但是根据您所描述的语义(“只有管理者拥有资源时才删除资源”),它实际上从来没有真正做到过。
关于c++ - 如何不拥有像shared_ptr这样的指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54447954/