我可以在没有自定义析构函数的情况下使用 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_ptr
s it returns linked to each other correctly, or does it
return independent shared_ptr
s 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.
我不明白你是怎么理解这个含义的。
我想要一个 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 returningstd::shared_ptr
to the clients?
是的。
Ie if I call
weak_ptr::lock()
multiple times on the same object are theshared_ptr
s it returns linked to each other correctly, or does it return independentshared_ptr
s 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.
我不明白你是怎么理解这个含义的。