unique_ptr的功能基本和shared_ptr相同,也是用于管理堆内存的智能指针,但是不允许多个unique_ptr指向同一个对象。 2.2 unique_ptr使用方法 初始化 std::unique_ptr<Z> up1; std::unique_ptr<Z> up2(nullptr); std::unique_ptr<Z> up1(new Z(1)); std::unique_ptr<Z> up2(up1); // 错误,不能使...
“弱引用计数”用来保存当前正在指向此基础对象的weak_ptr指针的个数,weak_ptr会保持控制块的生命周期,因此有一种特殊情况是:强引用的引用计数已经降为0,没有shared_ptr再持有基础对象,然而由于仍有weak_ptr指向基础对象,弱引用的引用计数非0,原本因为强引用计数已经归0就可以释放的基础对象内存,现在变成了“强引用...
可能更倾向于使用原始指针或其他类型的智能指针,如std::unique_ptr
std::shared_ptr<SharePtr> p2(nullptr);/*传入空指针 nullptr*/qDebug()<<"p2.count:"<<p2.use_count();/*C++11 标准中提供了 std::make_shared<T> 模板函数,其可以用于初始化 shared_ptr智能指针*/std::shared_ptr<SharePtr> share_ptr = std::make_shared<SharePtr>("123");/*查看资源的所...
shared_ptr的实现 我们平时看文档都知道shared_ptr内部是使用引用计数来记录托管指针被引用的次数,当托管指针的引用计数为0时会释放托管的内存,这里通过gcc源码探究shared_ptr内部究竟是如何实现的内存引用计数功能。 非标准类图如下: shared_ptr.jpg 如图,shared_ptr类几乎什么都没有做,它是继承了__shared_ptr, __...
如果isSameType为true,则表示std::shared_ptr<>的底层类型与T相同;如果isSameType为false,则表示std::shared_ptr<>的底层类型与T不同。 代码语言:txt 复制 if (isSameType) { // std::shared_ptr<>的底层类型与T相同的处理逻辑 } else { // std::shared_ptr<>的底层类型与T不同的处理逻辑 } 这...
我们早期第一版直接用std::shared_ptr来维护订单信息。每次变更索引时都是重新入删除和插入一个std::shared_ptr。std::shared_ptr底层的实现是使用std::atomic来维护了引用计数。每次变更操作都会导致std::atomic增减,同时带来 CPU Cache Line 失效。 在大多数场景下,这也没太大问题,因为大多数场景下参数传递std...
std::shared_ptr 是一种智能指针,多个shared_ptr可以指向同一个对象,至少有一个shared_ptr指向该对象时,该块内存不会被释放,直到所有指向该内存对象的shared_ptr都被回收或者通过 operator= or reset() 修改了指向的对象时,该对象的内存才会被自动释放。
接下来我们分析一下_Ptr_base基类的实现。_Ptr_base是一个模板类,模板参数是shared_ptr管理的指针对应的类型。该基类拥有如下这两个数据成员: 关于element_type : 可以看到element_type 就是模板参数对应的标量类型(scalar type)(since c++17)。 关于_Ref_count_base: ...
标准库提供两种智能指针,区别在于管理底层指针的方法不同,shared_ptr允许多个指针指向同一个对象,unipue_ptr则独占所指向的对象。标准库还定义了一种名为weak_ptr的伴随类,他是一种弱引用,指向shared_ptr所管理的对象,这三种智能指针都定义在memory头...