本文是基于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 这个字段则指向控制块,其中...
创建weak_ptr指针 1std::shared_ptr<int> s_p(newint(10));2std::weak_ptr<int> w_p(s_p);//赋值方式1 s_p.use_count不变3cout << s_p.use_count()<<""<<*(w_p.lock()) <<endl;4w_p = s_p;//赋值方式25cout << s_p.use_count() <<""<< *(w_p.lock()) << endl; ...
因为weak_ptr::lock返回了shared_ptr,而shared_ptr会增加引用计数,进而影响内部数据指针的释放,这也是lock的含义所在,想通过weak_ptr访问shared_ptr中的内部数据,需要先lock,返回一个shared_ptr,这相当于把weak_ptr“转换”为shared_ptr,然后通过shared_ptr随便访问去吧。
是为了配合 shared_ptr 而引入的一种智能指针,它指向由 shared_ptr 管理的对象,但不影响对象的生命周期。通过 weak_ptr,我们可以解决 shared_ptr 的循环引用问题,避免内存泄漏。 通过shared_ptr 来创建,但不增加引用计数。当需要访问 weak_ptr 指向的对象时,可以通过 lock() 方法转换为 shared_ptr,如果转换成功...
shared_ptr还定义了自己的类型转换操作符:static_pointer_cast, dynamic_pointer_cast, const_pointer_cast ,具体用法见下面代码。 (3)弱引用指针weak_ptr不能直接访问对象,但是他有一些工具函数可以用来用 .expired()用来查看自己监视的对象是否还在,或者他依赖的那些强引用指针们还有没有了 ...
在共享引用相互关联的情境下,若不采取恰当措施如使用weak_ptr,可能会导致资源无法正常释放,例如两个shared_ptr相互引用时,会形成资源释放瓶颈,无法正常执行析构函数。引入weak_ptr机制后,如将一个shared_ptr转换为weak_ptr,或在构造时即为weak_ptr,可有效解除引用计数锁定,保障资源得以正确清理。un...
你不会将 weak_ptr转换为 shared_ptr,因为这样会破坏首先使用 weak_ptr的整个目的。 要从 weak_ptr的实例中获得 shared_ptr,请拨打 weak_ptr上的 lock。 通常你会做以下事情:weak_ptr<foo> wp = ...; if (shared_ptr<foo> sp = wp.lock()) { // safe to use sp } boost...
3.shared_ptr与weak_ptr 36:28 4.std::move 与 值类型 20:13 5.std::forward,引用折叠,万能引用 26:01 6.函数重载专题 18:46 7.关于const 21:58 8.const reference延续临时变量l 07:07 9.成员函数const重载的本质 04:10 10.函数传参之左值与右值 05:53 11.Lambda表达式的本质 10:21...