将过期weak_ptr<T>转换为shared_ptr<T>的语法
Syntax for converting expired weak_ptr<T> to shared_ptr<T>
据我所知,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>
的删除器中,因此它不应该阻止对删除器的调用。
最终目标是获得一个不做一致堆分配的智能指针-或者至少只有一小部分。
从我读到的,shared_ptr不会被取消分配,直到对它的强引用和弱引用都被删除。
是错误的。std::shared_ptr
有两个块——一个控制块包含引用计数等,然后另一个块用于实际数据。
当共享计数变为0时,数据块(通常)被释放。这就是为什么从过期的std::weak_ptr
中生成std::shared_ptr
是非法的。
另一个注意事项,为什么你想要这个功能?它破坏了std::weak_ptr
的整个要点,即能够"存储"指向std::shared_ptr
存储的对象的指针,而不增加其引用计数。如果你想这样做,那么请使用std::shared_ptr
如果池化控制块是个好主意,那么库实现可能已经在做了。事实上,new
的实现本身可能已经在进行池化以支持类似的内存使用模式。
此外,您可以通过使用make_shared
而不是调用new
并将其传递给shared_ptr
构造函数来实现我认为您的目标;这个辅助函数存在的原因之一是,它可以编写为使用单个分配来同时分配控制块和正在创建的新对象。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中