C++智慧指標(一)智慧指標的簡單介紹
阿新 • • 發佈:2019-01-27
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;
}
這個程式碼僅從編譯執行是的角度是沒有問題的,但是細心看很明顯這段程式碼是不負責任的,因為它存在記憶體洩漏。只是釋放了_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;
}
異常物件在傳給對應的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配合解決)