C/C++教程

C++解决share_ptr造成的循环引用

本文主要是介绍C++解决share_ptr造成的循环引用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

参考链接:https://blog.csdn.net/yc2zgh1314/article/details/51264963

     https://www.cnblogs.com/duacai/p/13341422.html

 

先看有循环引用问题的代码:

#include<iostream>
using namespace std;
 
struct Node
{
    shared_ptr<Node> _pre;
    shared_ptr<Node> _next;
 
    ~Node()
    {
        cout << "~Node():" << this << endl;
    }
    int data;
};
 
void FunTest()
{
    shared_ptr<Node> Node1(new Node);
    shared_ptr<Node> Node2(new Node);
    Node1->_next = Node2;
    Node2->_pre = Node1;
 
    cout << "Node1.use_count:"<<Node1.use_count() << endl;
    cout << "Node2.use_count:"<< Node2.use_count() << endl;
}
 
int main()
{
    FunTest();
    system("pause");
    return 0;
}

结果(没有释放分配的堆内存):

 

程序模型图:

出现堆内存没有释放的原因是:

两个堆空间没有释放是因为指向它们的智能指针成员变量没有析构导致引用计数不为0,这个智能指针成员变量没有析构又是因为它们所属的堆对象没有析构,而这两个堆对象没有析构是因为它们被智能指针保管,该智能指针又被指向的堆对象的智能指针成员变量增加了引用计数。

解决的办法就是用weak_ptr取代智能指针成员变量,从而解决shared_ptr智能指针循环引用的问题。

代码:

#include<memory>
#include<iostream>
using namespace std;
 
struct Node
{
    weak_ptr<Node> _pre;
    weak_ptr<Node> _next;
 
    ~Node()
    {
        cout << "~Node():" << this << endl;
    }
    int data;
};
 
void FunTest()
{
    shared_ptr<Node> Node1(new Node);
    shared_ptr<Node> Node2(new Node);
    Node1->_next = Node2;
    Node2->_pre = Node1;
 
    cout <<"Node1.use_count:"<< Node1.use_count() << endl;
    cout <<"Node2.use_count:"<< Node2.use_count() << endl;
}
 
int main()
{
    FunTest();
    system("pause");
    return 0;
}

 

这篇关于C++解决share_ptr造成的循环引用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!