C++解決share_ptr造成的迴圈引用
阿新 • • 發佈:2021-12-14
參考連結: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;
}