前面學習智能指針的時候已經模擬實現過C++標準庫中的auto_ptr兩種方法,還有scoped_ptr(即boost庫中的unique_ptr)、scoped_array、以及shared_ptr。
現在我們對使用引用計數的shared_ptr進行分析,它存在以下問題:
1、引用計數更新存在着線程安全
2、循環引用問題
3、定製刪除器
首先貼出循環引用的代碼:
#include<boost/shared_ptr.hpp>
#include<boost/weak_ptr.hpp>
#include<iostream>
using namespace std;
using namespace boost;
struct Node
{
shared_ptr<Node> _pre;
shared_ptr<Node> _next;
int _value;
~Node()
{
cout<<"~Node()"<<endl;
}
};
void FunTest()
{
shared_ptr<Node> p1(new Node());
shared_ptr<Node> p2(new Node());
cout<<p1.use_count()<<endl;
cout<<p2.use_count()<<endl;
p1->_next = p2;
p2->_pre = p1;
cout<<p1.use_count()<<endl;
cout<<p2.use_count()<<endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}
那麼這段代碼又存在着什麼問題呢?可以畫個圖來簡單說明下
爲了解決循環引用問題,boost庫中引入了一個弱引用智能指針(weak_ptr)來打破循環引用,weak_ptr不增加引用計數。
下面分析弱智能指針weak解決循環引用的具體實現細節