【发布时间】:2015-07-18 06:52:53
【问题描述】:
根据我的阅读,shared_ptr<T> 在强引用和弱引用都被删除之前不会被解除分配。
我了解共享对象在没有更多强引用时被视为已过期。因此,weak_ptr<T> 的标准 lock() 函数在这种情况下会失败,因为该对象被视为“过期”。
但是,如果共享指针的删除器被覆盖,这样托管对象不会被删除,那么从 weak_ptr<T> 生成 shared_ptr<T> 应该是有效的 - 但我找不到正确的语法来执行此操作。
std::shared_ptr<int> s_ptr(new(42), D());
std::weak_ptr<int) w_ptr(s_ptr);
s_ptr.reset();
s_ptr = std::shared_ptr<int>(w_ptr, false);
编辑
为了进一步澄清这一点,我正在尝试构建一个可重用shared_ptr<T> 的对象池。这背后的原因是因为每次使用 shared_ptr 都会导致一个或多个堆内存分配。因此,我为每个 shared_ptr<T> 添加了一个删除器,它存储了一个 weak_ptr<T> 引用,这样删除器就会被调用,它应该能够将自己重新添加到可用的 shared_ptr<T> 对象池中(托管对象完好无损) .通过将weak_ptr<T> 存储在shared_ptr<T> 的删除器中,它不应该阻止删除器被调用。
最终目标是获得一个不进行一致堆分配的智能指针 - 或者至少只有一小部分。
【问题讨论】:
-
我不认为这种用途是有意的。此外,是什么让您如此确定指针在不再需要后保留在任何地方?只是好奇,你想解决什么?顺便说一句:你的第一句话到底是什么意思?究竟是什么没有被释放?对我来说这听起来模棱两可。
-
这对我来说听起来既无意义又危险,一个 XY 问题。实际目标是什么?
-
@Ulrich - 我的意思是第一句话比控制块仍然存在是强指针计数达到零。参考:“在 std::weak_ptr 计数器也达到零之前,控制块不会自行释放。”来自en.cppreference.com/w/cpp/memory/shared_ptr
-
@EJP,我正在尝试构建一个 shared_ptr 的对象池。不是托管对象池,而是对象的 shared_ptr 池。我保留对任何分配的 shared_ptr 的weak_ptr 引用,以保持其存活以供回收。
-
那么为什么删除器不将对象返回到池中呢?
标签: c++ shared-ptr weak-ptr