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

Can I make a shared object pool using std::shared_ptr and weak_ptr without a custom destructor?

我想要一个 class 名称为 Shader 的共享对象池。我希望 "client" 能够从池管理器请求具有某些参数的着色器,如果池中已经有一个,管理器将 return 一个指针或对它的引用,否则它会创建一个新着色器并在 return 对其引用之前将其添加到池中。到目前为止很容易。

但是,我还希望在所有客户端完成着色器后自动删除着色器。这可以通过将池实现为 std::weak_ptr 和 returning std::shared_ptr 的容器来实现吗?也就是说,如果我在同一个对象上多次调用 weak_ptr::lock() 是 shared_ptrs 它 return 正确地相互链接,还是 return 独立 shared_ptrs 导致 undefined behaviour? cpprefrence.com implies the latter,但他们没有明确指出这样做的危险,在我看来,错过了使 weak_ptr 变得更加有用的机会。

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

注意 lock() returns 非空指针当且仅当至少有一个 shared_ptr 指向该对象。如果有 none 那么该对象就已经被销毁了。因此 lock() 绝对必须实现共享权,否则它会在每次调用时中断。

终于 shared_ptr 支持 custom deleter functions,它们可能有助于从缓存中删除过时的条目。

Is this possible by implementing the pool as a container of std::weak_ptr and returning std::shared_ptr to the clients?

是的。

Ie if I call weak_ptr::lock() multiple times on the same object are the shared_ptrs it returns linked to each other correctly, or does it return independent shared_ptrs leading to undefined behaviour?

weak_ptr::lock() returns shared_ptr 链接到该对象的其他 shared_ptr 或当没有其他 shared_ptr 时为空 shared_ptr (IOW weak_ptr::expired()true)。

cpprefrence.com implies the latter, but they don't explictly point out the danger of that, and it seems to me that an opportunity was missed to make weak_ptr considerably more useful.

我不明白你是怎么理解这个含义的。