C++ 中智能指针的相互引用

循环引用指的是使用多个智能指针 shared_ptr 时,出现了指针之间的相互指向,从而形成环的情况,类似于死锁现象,在这种情况下智能指针往往不能正常调用对象的析构函数,从而造成内存泄漏;

 

复制代码
#include<iostream>
#include<memory>
using namespace std;

template<typename T>
class Node{
    public:
        Node(const T& value)
            :_pPre(NULL)
            , _pNext(NULL)
            , _value(value)
        {
            cout << "Node() " << endl;           
        }

        ~Node()
        {
            cout << "~Node()" << endl;
            cout << "this: " << this << endl;
        }

        shared_ptr<Node<T>> _pPre;
        shared_ptr<Node<T>> _pNext;
        T _value;
};

void Funtest(){
    shared_ptr<Node<int>> sp1(new Node<int>(1));
    shared_ptr<Node<int>> sp2(new Node<int>(2));

    cout << "sp1.use_count: " << sp1.use_count() << endl;
    cout << "sp2.use_count: " << sp2.use_count() << endl;

    sp1->_pNext = sp2;
    sp2->_pNext = sp1;

    cout << "sp1.use_count: " << sp1.use_count() << endl;
    cout << "sp2.use_count: " << sp2.use_count() << endl;   

}

int main(){
    Funtest();
    return 0;
}
复制代码

 

 shared_ptr 实现中可以得知,当我们知道了引用计数减为零时,析构时才会释放对象,而上述情况造成了一个僵局,就是当析构对象时先析构 sp2,但是 sp2 的空间 sp1还在使用,所以引用计数为 1,不释放,sp1 也是同理。这样就造成了死循环,最后谁也没释放,内存泄漏;

 

在实际编程过程中应该尽量避免出现智能指针之间相互指向的情况,如果避免不了就是用弱指针,weak_ptr 只使用,不增加计数,只要出了作用域就会自动析构。

 

posted @   王清河  阅读(1814)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示