注:shared_ptr和weak_ptr可看做由托管对象指针和控制块对象组成。控制块对象包含引用计数,以及可选的Allocator、Deleter成员。 如果只使用一个引用计数,我们无法保证weak_ptr观察者能合法的访问共享的控制块对象,如,weak_ptr引用了已经释放的shared_ptr。 三种内存布局 shared_ptr有三种不同的
std::shared_ptr<int> sPtr(new int(5)); std::weak_ptr<int> wPtr = sPtr; //weak_ptr不会改变shared_ptr,但是会和shared_ptr的引用保持一致 std::shared_ptr<int> sPtr2 = wPtr.lock(); //wPtr.lock()后会改变shared_ptr的引用计数(+1)...
std::shared_ptr<int> a = std::make_shared<int>(3); std::shared_ptr<char> b = std::make_shared<char>('a'); std::cout <<"shared_ptr object(int) size = "<<sizeof(a) << std::endl; std::cout <<"shared_ptr object(char) size = "<<sizeof(b) << std::endl; std::wea...
std::cout<<"shared_ptr object(char) size = "<<sizeof(b)<<std::endl; ??? ??std::weak_ptr<A>shadow_a; ??std::weak_ptr<B>shadow_b; ??? ??{ ??std::shared_ptr<A>ptr_a=std::make_shared<A>(); ??std::shared_ptr<B>ptr_b=std::make_shared<B>(); ??? ??shadow_a=...
weak_ptr weak_ptr概述: 用来辅助shared_ptr进行工作 week 弱 弱共享 弱引用 共享其他shared_ptr所指向的对象 强指针指的是 shared_ptr 弱指针指的是 weak_ptr weak_ptr 也是类模板,也是智能指针,这个智能指针用来指向一个shared
weak_ptr就是用来解决循环引用问题的,所以拷贝和赋值的智能指针必须是shared_ptr。weak_ptr和shared_ptr并不是同一个类,所以获取shared_ptr中的_ptr时,不能直接访问,需要通过shared_ptr的接口get()来获取。 template<class T> // 辅助型智能指针,配合解决shared_ptr循环引用问题 class weak_ptr // 没有RAII,不...
使用lock() 方法,如果 std::weak_ptr 过期则返回空的 std::shared_ptr。 std::shared_ptr<Widget> spw1 = wpw.lock(); // 如果 wpw 过期,spw1 将为空 1. 或者直接构造 std::shared_ptr,如果 std::weak_ptr 过期则抛出 std::bad_weak_ptr 异常。
new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。weak_ptr 传给thread、timer回调,不能使用expired()判断 new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。
简介:从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr 从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr(上):https://developer.aliyun.com/article/1522495 3.1 auto_ptr模拟代码 (上面SmartPtr再加一个赋值重载改下名字就差不多是auto_ptr的模拟了,再用命...
一个weak_ptr提供对一个或多个shared_ptr实例拥有的对象的访问,但不参与引用计数。weak_ptr的主要使用场景,一是用于探查是否内存空间是否有效,用户可以通过expired()或者lock()来检测数据的有效性,以避免空指针。二是可以用于打破循环引用。c++20中的原子智能指针 智能指针的计数器是线程安全,但是其指向的对象的...