https://blog.csdn.net/nou_camp/article/details/70176949
C++智能指針?
在正式了解智能指針前先看一下下面的一段代碼
#include<iostream>
using namespace std;
class A
{
public:A():_ptr(NULL), _a(0){}~A(){}
public:int* _ptr;int _a;
};void test()
{A a;int *p1 = new int(2);
}
int main()
{test();system("pause");return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
這個代碼僅從編譯運行是的角度是沒有問題的,但是細心看很明顯這段代碼是不負責任的,因為它存在內存泄漏。只是釋放了_ptr,但是p1壓根沒釋放。在這里看起來內存泄漏沒有對結果造成什么,但是千萬不要小瞧內存泄漏,這是個很嚴重的問題。如果一個特別大的項目中存在很多很多的內存泄漏問題,一開始可能沒有什么問題,但是過一段時間服務器可能會掛掉,這就是內存泄漏導致內存不夠用產生的。?
為了解決這些問題,可以采用下面這種方法。
#include<iostream>
using namespace std;
void fun()
{throw 2;
}
int main()
{try{fun();}catch (int e){cout << e << endl;}system("pause");return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
異常對象在傳給對應的catch處理后撤銷。這樣做是可以的,但是如果代碼中有比較多的異常,這樣顯然不合適,大量的try catch會影響代碼邏輯,導致代碼丑陋不堪。為了解決這個問題,引入了智能指針。?
說到智能指針,必須知道RAII?
RAII:資源分配即初始化,定義一個類來封裝資源的分配和釋放,在構造函數完成資源的分配和初始化,在析構函數完成資源的清理,可以保證資源的正確初始化和釋放。智能指針只是RAII的一種應用。?
智能指針:所謂智能指針就是智能/自動化的管理指針所指向的動態資源的釋放。?
智能指針的發展可分為三個部分,?
1.auto_ptr 管理權的轉移–帶有缺陷的設計–c++98/03?
2.scoped_ptr(boost) unique_ptr(c++11) 防拷貝 –簡單粗暴的設計 –功能不全?
3.shared_ptr(boost/c++11) 引用計數 –功能強大(支持拷貝,支持定制刪除器) 缺陷–循環引用(可采用weak_ptr配合解決)