在我的资源管理器中,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_ptrshared_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/

    10-11 18:51