从我所读过的内容来看,shared_ptr<T>
在取消强引用和弱引用之前不会被取消分配。
我理解一个共享对象在没有更强引用时被认为已过期。因此,weak_ptr<T>
的标准lock()函数在这种情况下失败,因为该对象被视为已过期&#39;。
但是,如果覆盖共享指针的删除器以便不删除托管对象,那么从shared_ptr<T>
生成weak_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>
添加了一个删除器,这样删除器就会被调用它应该能够将自己重新添加到可用的{{1}池中。对象(托管对象完好无损)。通过将shared_ptr<T>
存储在weak_ptr<T>
删除内,因此不应该停止调用删除。
最终目标是获得一个没有进行固定堆分配的智能指针 - 或者至少只有少量数据。
答案 0 :(得分:1)
根据我的阅读,在删除强引用和弱引用之前,不会取消分配shared_ptr。
错误。 a std::shared_ptr
有两个块 - 一个包含引用计数的控制块等,然后是另一个块用于实际数据。
当共享计数变为0时,(通常)数据块被解除分配。这就是为什么从过期的std::shared_ptr
中制作std::weak_ptr
是违法的。
另一方面,为什么你想要这个功能呢?它破坏了std::weak_ptr
的整个点,它能够&#34;存储&#34;指向由std::shared_ptr
存储的对象的指针,而不增加其引用计数。
如果您想这样做,请使用std::shared_ptr
答案 1 :(得分:1)
如果汇集控制块是个好主意,那么库实现可能已经正在执行它。实际上,make_shared
本身的实现可能已经在进行池化以支持类似的内存使用模式。
此外,您可以使用new
而不是调用shared_ptr
并将其传递给{{1}}构造函数来实现我认为您的目标;这个辅助函数存在的原因之一是它可以编写为使用单分配来分配控件块和你正在创建的新对象在同一时间。