我想拥有一个类名为Shader的共享对象池。我希望“客户端”能够从池管理器中请求具有某些参数的着色器,如果池中已有一个参数,则管理器将返回指针或对它的引用,否则它将创建一个新的Shader并将其添加到在返回其引用之前的池。到目前为止很容易。
但是,我还希望在所有客户端完成它们后自动删除着色器。这可以通过将池实现为std :: weak_ptr的容器并将std :: shared_ptr返回给客户端来实现吗?即如果我在同一个对象上多次调用weak_ptr :: lock(),那么它返回的shared_ptrs是否正确链接到彼此,还是返回导致undefined behaviour的独立shared_ptrs? cpprefrence.com implies the latter,但他们没有明确指出这种危险,而且在我看来,错过了使weak_ptr更有用的机会。
答案 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
更有用。
我无法理解你是如何阅读这种含义的。