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::cout<<"shared_ptr object(int) size = "<<sizeof(a)<<std::endl; ??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::cout <<"shared_ptr object(int) size = "<<sizeof(a) << std::endl; 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::s...
weak_ptr是一种用于解决shared_ptr相互引用时产生死锁问题的智能指针。如果有两个shared_ptr相互引用,那么这两个shared_ptr指针的引用计数永远不会下降为0,资源永远不会释放。weak_ptr是对对象的一种弱引用,它不会增加对象的use_count。weak_ptr指针通常不单独使用,只能和 shared_ptr 类型指针搭配使用,可以作为shared...
(如果使用了std::weak_ptr)一个弱引用计数 对象的销毁器和分配器的信息(如何销毁对象和释放内存) 指向实际数据的指针:这是std::shared_ptr持有的,用于访问被管理对象的指针。 每当通过复制构造函数或赋值操作符创建新的std::shared_ptr时,与该指针关联的控制块中的引用计数会增加。当std::shared_ptr的实例被销毁...
这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr)。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。 shared_ptr shared_ptr 基本用法 shared_ptr采用引用计数的方式管理所指向的对象。当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计...
weak_ptr并不增加shared_ptr的引用计数,因此有可能发生对象已经析构但是weak_ptr还在的情况,此时使用weak_ptr就必须小心,当对象即将发生析构或者已经析构,expired返回true,expired函数效率比use_count高,该函数返回true时其结果才有意义,因为返回false时,此时执行下一个语句,对象有可能在其他线程同时被释放。
new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。weak_ptr 传给thread、timer回调,不能使用expired()判断 new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。
std::shared_ptr<int> sp_i2 = sp_i1; // sp_i2和sp_i1同时指向int(100),int(100)的引用计数变为2。 sp_i1.reset(new int(200)); // sp_i1指向int(200),int(100)的引用计数变为1。 sp_i2.reset(); // int(100)的引用计数变为0,被析构。 4、weak_ptr 正如Objective-C会出现循环引...
(3)安全地转换为 std::shared_ptr: 使用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 异常。