如何不拥有像shared_ptr这样的指针?

时间:2019-01-30 19:14:17

标签: c++

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

2 个答案:

答案 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>