智慧型指標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
12#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...