智慧型指標auto ptr介紹

2022-07-18 07:42:11 字數 3368 閱讀 4343

我們大家都知道,new一定要和delete配合使用,但是有一種情況可能會使這種配對失效,如下程式:

#include using namespace std;

class normal_pointer_example

~normal_pointer_example()

};class normal_pointer_wrong{};//normal_pointer_wrong異常

bool quit;

void quit_func()

int main()

catch (normal_pointer_wrong)

return 0;

}

該程式的輸出結果為:

注意上面這個輸出,我們看到當程式全部執行完了都沒有能夠呼叫析構函式將物件析構掉!這就說明並沒有把物件delete掉!!這個就是問題,因為這樣就有可能產生不易察覺的記憶體洩露。

針對上面這個情況,我們就要使用智慧型指標類auto_ptr來避免這種情況出現。們來看乙個auto_ptr類的宣告:

1

template

<

class

_ty>

2class

auto_ptr311

12auto_ptr(auto_ptr

<

_ty>&

_right) _throw0()

13: _myptr(_right.release())

1416

17auto_ptr(auto_ptr_ref

<

_ty>

_right) _throw0()

1823

24template

<

class

_other

>

25operator

auto_ptr

<

_other

>

() _throw0()

2629

30template

<

class

_other

>

31operator

auto_ptr_ref

<

_other

>

() _throw0()

3238

3940

template

<

class

_other

>

41auto_ptr

<

_ty>&

operator

=(auto_ptr

<

_other

>&

_right) _throw0()

4246

47template

<

class

_other

>

48auto_ptr(auto_ptr

<

_other

>&

_right) _throw0()

49: _myptr(_right.release())

5052

53auto_ptr

<

_ty>&

operator

=(auto_ptr

<

_ty>&

_right) _throw0()

5458

59auto_ptr

<

_ty>&

operator

=(auto_ptr_ref

<

_ty>

_right) _throw0()

606667~

auto_ptr()

6871

72_ty

&operator

*()

const

_throw0()

7384

85_ty

*operator

->

() const

_throw0()

8695

96_ty

*get

() const

_throw0()

97100

101_ty

*release() _throw0()

102107

108void

reset(_ty

*_ptr =0

)109

114115

private

:116

_ty

*_myptr;

//117

};118

_std_end

從上面這個定義就可以看出來,定義個智慧型指標就相當於建立了乙個auto_ptr類的物件。現在我們再來看看這個類的析構函式:

~auto_ptr()

這裡我們就可以看到,由於在私有資料成員中定義了乙個模板指標:

_ty *_myptr;
所以說在上面的析構函式裡面,當我們刪除_myptr指標的時候,其實就是呼叫delete刪除_myptr所指向的記憶體塊。所以每當我們定義乙個智慧型指標,就是定義了乙個auto_ptr類的物件,如:

auto_ptrp (new string);
這句話就定義了乙個auto_ptr類的物件p,尖括號裡面的string用了初始化它的模板成員_ty的型別。那麼這裡面,只要auto_ptr物件存在,它指向的字串就存在,同理,如果auto_ptr物件不存在,會利用auto_ptr類中的析構函式自動銷毀它所指向的字串,也就避免了記憶體洩露。

好了,下面我們來用智慧型指標重寫上面的程式,看看會有什麼結果。

#include #include using namespace std;

class normal_pointer_example

~normal_pointer_example()

};class normal_pointer_wrong{};//normal_pointer_wrong異常

bool quit;

void quit_func()

int main()

catch (normal_pointer_wrong)

return 0;

}

首先需要注意的是,要呼叫auto_ptr智慧型指標,必須包含標頭檔案。另外,程式的輸出:

看到沒有,這樣一來,析構函式就執行咯~~

auto ptr智慧型指標

1 class auto ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。注意 auto ptr不允許使用一般指標慣用的賦值 assign 初始化方式。必須...

智慧型指標 AutoPtr

include include include using namespace std void func autoptr 析構函式來負責釋放 void test catch exception e autoptr 析構函式來負責釋放 private t ptr struct aa void fun...

c 智慧型指標介紹之auto ptr

作用及特性 智慧型指標的引用,主要是為了解決異常發生時產生記憶體洩漏。auto ptr在建立的時候獲取物件的所有權,在析構的時候,釋放物件記憶體空間 raii1 過載了函式的 和 運算子,使得其操作看起來像個內建指標。沒有使用引用計數,在複製構造或賦值的時候發生所有權轉移 包含的操作 拷貝構造 賦值...