b->ptrA_ = a;printf("user count:%d %d\n", a->ptrB_.use_count(), b->ptrA_.use_count());return0; } 最后打印: ./a.out A() B() user count:2 2 循环引用,内存泄漏 改进版本 使用 shared_ptr<A> ptrA_ 改为 weakptr<A> ptrA_ 但是类里面无法使用ptrA_, 因为weakptr只有访问权限...
shared_ptr是C++标准库中的一种智能指针,用于管理动态分配的对象。它使用引用计数机制来跟踪有多少个shared_ptr实例指向同一个对象。当最后一个指向对象的shared_ptr被销毁或重置时,该对象也会被自动删除,从而避免内存泄漏。 2. 描述shared_ptr循环引用的情况 循环引用发生在两个或多个shared_ptr实例相互引用对方所管...
shared_ptr采用引用计数的方式,为0的时候就会去析构对象。 可以发现weak_ptr,不影响引用计数,是一种不控制对象生命周期的智能指针。 int main(){shared_ptr<int> sp(new int(10));cout<<sp.use_count()<<endl; //输出1weak_ptr<int> wp1=sp;weak_ptr<int> wp2=sp;cout<<sp.use_count()<<endl; ...
std::shared_ptr<SubController>sub_controller_; }; 了解weak_ptr知道,他不会导致引用计数增加 改成weak_ptr后的变成: 输出 具体步骤: 先调用包含sub_controller的 shared_ptr析构函数,内部引用计数-1,2-1=1,所以不会调用sub_controller析构 然后调用包含controller的 shared_ptr析构函数,内部引用计数-1,1-1...
简单说,就是在遇到循环引用的时候,你通过标记这个引用是std::weak_ptr类型,然后他就不会再增加std::shared_ptr 智能指针的引用计数了。比如: A引用B 引用计数+1 B引用A(std::weak_ptr<A>) 引用计数不增加 既然不增加,那控制块就不知道你这里用了A的引用,那他释放资源的时候,就可能提前给释放了。因为他都...
第一步:了解shared ptr 在介绍shared ptr循环引用之前,我们需要理解什么是shared ptr。shared ptr是指向动态内存分配的指针,但是它不仅仅是一个原始指针,还记录了指向的内存块被多少个shared ptr对象使用,当使用完毕后会自动释放其中的内存空间。 shared ptr通过引用计数的方式实现内存管理,也就是说,每个共享指针都包含...
当两个或多个std::shared_ptr相互持有对方,形成了一个闭环,那么即使这些对象已经不再被程序其他部分直接使用,它们的引用计数也不会降为零。因此,这些对象不会被自动释放,从而导致内存泄漏。 2. 示例 如例子,a和b离开作用域,但因为循环引用,它们不会被销毁 ...
当两个对象相互持有对方的 shared_ptr 时,我们可以使用 std::weak_ptr 来解决循环引用的问题。std::weak_ptr 是一种弱引用,它可以指向由 shared_ptr 管理的对象,但并不会增加对象的引用计数。我们可以通过调用 std::weak_ptr 的 lock() 方法获得一个指向对象的 shared_ptr,如果对象已经被释放,则返回一个空...
shared_ptr虽然方便,但是它有着一个致命的缺陷就是循环引用问题,因为shared_ptr本身并没有能力解决这个问题,所以我们又引入了弱指针weak_ptr来辅助shared_ptr解决这个问题。 那么循环引用又是什么场景? 举个栗子: 假设现在我们要创建一个双向×××链表,但是这个链表的指针域全部都用shared_ptr维护: ...