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

C++ 我可以在没有自定义析构函数的情况下使用std::shared_ptr和弱_ptr创建共享对象池吗?,c++,c++11,shared-ptr,weak-ptr,C++,C++11,Shared Ptr,Weak Ptr,我想要一个共享对象池,其类名为Shader。我希望“客户机”能够从池管理器请求具有特定参数的着色器,如果池中已有一个着色器,则池管理器将返回指向该着色器的指针或引用,否则它将创建一个新着色器,并在返回其引用之前将其添加到池中。到目前为止还很容易 但是,我还希望在所有客户端完成着色器后自动删除它们。通过将池实现为std::weak_ptr的容器并将std::shared_ptr返回给客户端,这是否可行?也就是说,如果我在同一个对象上多次调用弱\u ptr::lock(),它返回的共享\u ptr是

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

但是,我还希望在所有客户端完成着色器后自动删除它们。通过将池实现为std::weak_ptr的容器并将std::shared_ptr返回给客户端,这是否可行?也就是说,如果我在同一个对象上多次调用弱\u ptr::lock(),它返回的共享\u ptr是相互正确链接的,还是返回独立的共享\u ptr导致,但是他们没有明确指出这一点的危险性,在我看来,使弱ptr变得更加有用的机会已经错过了。

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

请注意,如果至少有一个指向对象的共享\u ptr,lock()将返回非空指针。如果没有,那么这个物体就已经被摧毁了。因此lock()绝对必须实现共享权限,否则每次调用都会中断

最后,共享的ptr支持,它们可能有助于从缓存中删除过时的条目

通过将池实现为
std::weak_ptr
的容器并将
std::shared_ptr
返回给客户端,这是否可行

如果我在同一个对象上多次调用
weak\u ptr::lock()
,则 它返回的
shared_ptr
s彼此正确链接,或者 返回导致未定义行为的独立
共享\u ptr
s

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

cpprerence.com暗示了后者,但他们没有明确指出 这是危险的,在我看来,一个机会被错过了 使
弱\u ptr
更有用


我无法理解您是如何理解这一含义的。

您的容器如何知道其元素是否无效?如果不打算使用引用计数,则需要执行一些垃圾收集。我的错误推断是因为我读得太快,误解了弱\u ptr中的含义(我愚蠢地认为它是弱\u ptr拥有的原始指针),并且没有发现共享\u ptr有一个接受弱\u ptr的构造函数。是的,自定义删除程序应该非常方便。如果着色器在销毁期间将自己从池中删除,则不需要特殊的删除程序。@ÖTiib是的,这是一个可行的选项,但在我看来,让着色器知道缓存是一个有点草率的设计。保持它们的分离至少有一些好处。@NickZavaritsky OP描述了工厂方法,“客户机”可以从中请求共享着色器。我将使该方法和池成为着色器的静态成员,以保持其公共界面小而清晰。我不确定这样的设计有什么马虎之处。@ÖTiib我的想法是着色器对象应该承担作为着色器的单一责任,让它负责缓存违背了坚实的原则。对不起,您的设计没有马虎之处,请原谅。我建议我们现在就结束讨论)