在类设计中,如果一个类需要引用另一个类的实例,但不希望参与其生命周期管理(即不希望增加其引用计数),则应当使用std::weak_ptr。
先调用包含sub_controller的 shared_ptr析构函数,内部引用计数-1,2-1=1,所以不会调用sub_controller析构 然后调用包含controller的 shared_ptr析构函数,内部引用计数-1,1-1=0,调用controller析构,编译器在controller析构函数执行的时候还会调用成员类的析构,也就是std::shared_ptr<SubController> sub_controller_;...
因此只要将例子一中,类成员从shared_ptr改为weak_ptr,即可解决循环引用问题
为了避免循环引用导致的内存泄漏,我们可以使用std::shared_ptr和std::weak_ptr来管理它们的生命周期。 // 循环引用的使用场景#include<iostream>#include<memory>classB;//前向声明classA{public:std::shared_ptr<B>b_ptr;//此处引用了B~A(){std::cout<<"A的析构"<<std::endl;}};classB{public:std::...
当两个对象相互持有对方的 shared_ptr 时,我们可以使用 std::weak_ptr 来解决循环引用的问题。std::weak_ptr 是一种弱引用,它可以指向由 shared_ptr 管理的对象,但并不会增加对象的引用计数。我们可以通过调用 std::weak_ptr 的 lock() 方法获得一个指向对象的 shared_ptr,如果对象已经被释放,则返回一个空...
std::weak_ptr是一种不增加引用计数的智能指针,它持有一个非拥有(non-owning)的引用。在上述例子中,可以将一个方向的std::shared_ptr替换为std::weak_ptr,以打破循环引用。 class ClassA { public: std::shared_ptr<ClassB> ptrB; }; class ClassB { ...
//shared_ptr:功能全,支持拷贝,引用计数。设计复杂,循环引用 namespace juju { template<class T> class shared_ptr { public: shared_ptr(T* ptr) :_ptr(ptr) , _pcount(new int(1))//将它初始化为1 , _pmtx(new std::mutex) {} ~shared_ptr() ...
为解决循环引用的问题,仅使用shared_ptr是无法实现的。堡垒无法从内部攻破的时候,需要借助外力,于是有了weak_ptr,字面意思是弱指针。为啥叫弱呢?shared_ptr A被赋值给shared_ptr B时,A的引用计数加1;shared_ptr A被赋值给weak_ptr C时,A的引用计数不变。引用力度不够强,不足以改变引用计数,所以就弱了(个人...
shared ptr通过引用计数的方式实现内存管理,也就是说,每个共享指针都包含一个引用计数器,用于表示该指针指向的对象被多少个shared_ptr对象所共享。当引用计数减为0时,表示该对象没有被任何shared_ptr对象所引用,可以自动释放内存空间。 第二步:了解循环引用 循环引用指的是在程序中有两个或多个对象相互引用,并且无法...
“循环引用”简单来说就是:两个对象互相使用一个 shared_ptr 成员变量指向对方。这样会引发一个问题,其中任何一个对象的引用计数都为2。析构时两个资源引⽤计数会减⼀,于是两者引⽤计数还是大于0,导致跳出函数时资源没有被释放(离开作用域时两个对象的析构函数没有被调⽤) ...