關於智慧型指標auto ptr

2022-05-24 21:51:11 字數 1999 閱讀 4792

智慧型指標auto_ptr和shared_ptr也是面試中經常被問到的乙個

感覺看auto_ptr的原始碼反而更加容易理解一些,因為原始碼的**量並不大,而且比較容易理解。

本篇主要介紹auto_ptr

其特點如下:

1.首先auto_ptr智慧型指標是個封裝好的類;

2.是採用棧上的指標去管理堆上的內容,所以auto_ptr所管理的物件必須是new出來的,也不能是malloc出來的,

原因:在auto_ptr的實現機制中,採用的是delete 掉乙個指標,該delete一方面是呼叫了指標所指物件的析構函式(這也是為什麼採用智慧型指標,new了乙個物件,但是不用delete的原因),另一方面釋放了堆空間的記憶體;

3.一塊堆上的記憶體不能被兩個智慧型指標同時指向(

這個就是所有權和管理權的問題),想想也是,如果兩個智慧型指標同時指向的話,每個智慧型指標物件析構的時候,都會呼叫一次delete,導致堆空間記憶體被釋放兩次,然而這是不被允許的。

4.aut0_ptr不能管理陣列,因為析構呼叫的是delete,如果管理陣列的話,需要呼叫delete;

相比於普通指標的額優點就是:

普通指標在new 和delete之間發生異常,並且異常不能**獲的話,就不會執行delete,那麼這片記憶體就不能被**。

但是auto_ptr就不會存在這樣的問題。

其具體實現**如下:應該是別人寫的啊,感覺寫的很不錯啊,基本實現了auto_ptr的所有功能,而且容易讀懂!

1

//auto_ptr.h23

#ifndef auto_ptr_h

4#define auto_ptr_h

56 template7

class

auto_ptr8;

3637 template38 auto_ptr::auto_ptr(t*p)

39:pointee(p)

40{}

4142 template43 template44 auto_ptr::auto_ptr(auto_ptr&rhs)

45:pointee(rhs.release())

46{}

4748 template49 auto_ptr::~auto_ptr()

5053

54 template55 template56 auto_ptr& auto_ptr::operator=(auto_ptr&rhs)

5762

63 template64 t& auto_ptr::operator*() const

6568

69 template70 t* auto_ptr::operator->() const

7174

75 template76 t* auto_ptr::get() const

7780

81 template82 t* auto_ptr::release()

8388

89 template90

void auto_ptr::reset(t*p)

9197}98

99#endif

1

2#ifndef item_h

3#define item_h45

class

item6;

1314

#endif

1516

17using

std::cout;

18using

std::endl;

1920 item::item(void)21

2425 item::~item(void)26

2930

void item::printcontent() const

31

#include #include 

"auto_ptr.h

"#include

"item.h

"using

std::cout;

intmain()

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...

stl智慧型指標auto ptr

感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...