1. 程式人生 > >C++智慧指標(一)智慧指標的簡單介紹

C++智慧指標(一)智慧指標的簡單介紹

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配合解決)