本文是基于gcc-4.9.0的源代码进行分析,shared_ptr和weak_ptr是C++11才加入标准的,所以低版本的gcc源码是没有shared_ptr和weak_ptr的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是原理和设计思想的一样的,下面给出源码下载地址http://ftp.gnu.org/gnu/gcc 3、智能指针概念 智能指针(S...
同时我们有了一个新的type叫做waek_ptr<T>用来表示对应元素的weak_ptr的类型 字段 其中有两个字段,分别是指向对象的指针element_type* __ptr_和 指向控制块的指针__shared_weak_count* __cntrl_其继承于__shared_count __ptr_ 这个字段就是指向原本指向的对象 __shared_weak_count 这个字段则指向控制块,其中...
从上面的代码中我们可以看到,首先__shared_count使用__weak_count的_M_pi来构建自己的_M_pi,从前面的分析我们可以知道,在所有的shared_ptr和weak_ptr消亡之前,_M_pi的内存是不会被释放的,所以这里就算之前的shared_ptr已经全部消亡(即资源已释放),_M_pi还是有效的(因为weak_ptr还没有消亡)。而通过判断_M_...
共享同一块内存std::shared_ptr<int>ptr2=ptr1;// 增加引用计数std::cout<<ptr1.use_count()<<std::endl;// 输出: 2// 通过弱引用指针weak_ptr解决
typedef shared_ptr<UDPProtocol> SProtocol;//SProtocol是一个指向UDPProtocol类型内存的指针,并且是一个强引用,即他拥有访问该存储的权限,并且他的指向会增加计数引用,并并且他有权释放该内存typedef weak_ptr<UDPProtocol> WProtocol;//WProtocol是指向该内存的弱引用,他可以看作是就是一个快照!!!structEle{ ...
在C++ 中,智能指针是一种用于管理动态内存分配和释放的工具,它可以帮助我们避免内存泄漏和悬空指针的问题。C++11 引入了三种智能指针:shared_ptr、unique_ptr 和 weak_ptr。每种智能指针都有其特定的用法和适用场景。 的实现原理 是一种智能指针,允许多个 shared_ptr 实例共享同一个对象的所有权。它使用引用计数的...
智能指针是一个包装类,内部包装了真正的数据指针(即new出来的内存地址)和一个引用计数。 当构造智能指针时(即智能指针的构造函数或者复制构造函数被调用时),引用计数会加1; 当析构智能指针时(即析构函数被调用时)引用计数会减1,并判断引用计数是否为0,为0时调用delete删除真正的数据指针; ...
1. 所有权关系:shared_ptr具有共享所有权,多个shared_ptr可以共享同一块内存资源,当最后一个shared_ptr销毁时,内存资源才会被释放;而weak_ptr不具有所有权,它只是对...
[modern c++] shared_ptr和weak_ptr shared_ptr shared_ptr是用来智能管理内存的,shared_ptr的 构造函数,拷贝构造,拷贝赋值 这三个动作都会导致 引用计数的增加,析构函数,移动拷贝,移动赋值 这三个动作都会导致 引用计数的减少。当引用计数为 0 时,指向的资源被释放,但是要记得自行把shared_ptr置空,它不...
对于shared_ptr和weak_ptr,都仅持有两个字段,指向对象地址的指针ptr,和指向计数器对象的指针rep。 对于计数器对象,我们仅需要关心两个字段,一个是弱引用计数weaks(无符号整型),一个是强引用计数uses(无符号整型)。 那么,若s1,s2是仅有的两个指向对象obj的shared_ptr,w1,w2,w3是仅有的三个指向对象obj的weak_...