//weak_ptr的创建voidfunc1(){//创建weak_ptr的时候,一般是用一个shared_ptr来初始化autopi = make_shared<int>(100);//shared_ptr//pi引用计数(强引用计数)不改变,但是弱引用计数会改变(弱引用计数会从0变成1)//强引用计数才能决定对象的声明期,弱引用计数对对象声明周期没有影响weak_ptr<int>
weak_ptr特点:没有*操作和->操作 weak_ptr是不控制所指对象生存周期的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的计数器。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向这个对象,对象也会被释放。 一,先来个表格,唠唠wea...
weak_ptr可以通过shared_ptr构建以及赋值 shared_ptr<ClassA> spA(new ClassA); weak_ptr<ClassA> wpA1(spA); weak_ptr<ClassA> wpA2 = spA; 1. 2. 3. expired函数 weak_ptr并不增加shared_ptr的引用计数,因此有可能发生对象已经析构但是weak_ptr还在的情况,此时使用weak_ptr就必须小心,当对象即将发生...
当与std::shared_ptr一起使用时,你可以通过std::weak_ptr安全地访问对象,而不会导致循环引用。当std::shared_ptr指向的对象被删除时,所有相关的std::weak_ptr对象都会变得空无,你可以通过调用expired()函数来检测这一点。 下面是一个使用std::weak_ptr解决循环引用问题的例子: #include <iostream>#include <me...
weak_ptr引入可以解决shared_ptr交叉引用时无法释放资源的问题。 示例代码: #include<iostream>#include<memory>usingnamespacestd;classB;classA{public:A(){cout <<"A constructor ... "<< endl;} ~A(){cout <<"A destructor ..."<< endl;} ...
由于weak_ptr并不会改变shared_ptr的引用计数,所以修改类A,和类B中的shared_ptr对象为weak_ptr对象即可释放资源。 修改后的代码如下: #include<iostream> #include<memory> usingnamespacestd; classB; classA{ public: ??A(){cout<<"A constructor ... "<<endl;} ...
注:shared_ptr和weak_ptr可看做由托管对象指针和控制块对象组成。控制块对象包含引用计数,以及可选的Allocator、Deleter成员。 如果只使用一个引用计数,我们无法保证weak_ptr观察者能合法的访问共享的控制块对象,如,weak_ptr引用了已经释放的shared_ptr。
std::weak_ptr是解决悬空指针问题的一种很好的方法。仅通过使用原始指针,就不可能知道所引用的数据是否已被释放。相反,通过让std::shared_ptr管理数据并将std::weak_ptr提供给数据用户,用户可以通过调用expired()或lock()来检查数据的有效性。 您不能单独使用std::shared_ptr来执行此操作,因为所有std::shared_ptr...
简介: 从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/1522496 6. weak_ptr weak_ptr是为解决循环引用问题而产生的,可以把weak_ptr当作shared_ptr的小跟班,weak...
new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。weak_ptr 传给thread、timer回调,不能使用expired()判断 new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。