我可以在没有自定义析构函数的情况下使用std :: shared_ptr和weak_ptr创建共享对象池吗?

时间:2015-01-22 17:13:31

标签: c++ c++11 shared-ptr weak-ptr

我想拥有一个类名为Shader的共享对象池。我希望“客户端”能够从池管理器中请求具有某些参数的着色器,如果池中已有一个参数,则管理器将返回指针或对它的引用,否则它将创建一个新的Shader并将其添加到在返回其引用之前的池。到目前为止很容易。

但是,我还希望在所有客户端完成它们后自动删除着色器。这可以通过将池实现为std :: weak_ptr的容器并将std :: shared_ptr返回给客户端来实现吗?即如果我在同一个对象上多次调用weak_ptr :: lock(),那么它返回的shared_ptrs是否正确链接到彼此,还是返回导致undefined behaviour的独立shared_ptrs? cpprefrence.com implies the latter,但他们没有明确指出这种危险,而且在我看来,错过了使weak_ptr更有用的机会。

2 个答案:

答案 0 :(得分:1)

多次调用weak_ptr :: lock()是正确的,返回的shared_ptr配置正确,即所有具有公共指针的shared_ptr-s共享引用计数器。

请注意,如果至少有一个指向该对象的shared_ptr,则lock()返回非空指针。如果没有,则该对象将被销毁。因此,lock()绝对必须实现共享权,否则它会在每次调用时中断。

最后,shared_ptr支持custom deleter functions,它们可能对从缓存中删除陈旧条目很有用。

答案 1 :(得分:1)

  

这可以通过将池实现为std::weak_ptr的容器并将std::shared_ptr返回给客户端来实现吗?

  

即如果我在同一个对象上多次调用weak_ptr::lock()   它返回的shared_ptr正确链接到彼此,或者它   返回独立shared_ptr导致未定义的行为?

weak_ptr::lock()会将shared_ptr链接到该对象的其他shared_ptr,或者在没有其他shared_ptr时返回shared_ptr(IOW weak_ptr::expired() }是true)。

  

cpprefrence.com暗示后者,但他们并没有明确指出   这种危险,在我看来,机会被遗漏了   使weak_ptr更有用。

我无法理解你是如何阅读这种含义的。