本文講述關於auto_ptr智慧型指標賦值時乙個古怪的現象。
1.為何要使用智慧型指標
void
fun(
)
在動態分配乙個記憶體時,需要使用delete來手動釋放掉,若忘記釋放掉記憶體就會造成記憶體的洩露。所以為了優雅的解決這個問題,智慧型指標就出現了。
2.auto_ptr 智慧型指標賦值操作
int
getindex()
; std::auto_ptr
test1
(new pack)
; test1.index =1;
std::auto_ptr
test2
(test1)
;return test1.index;
}
好了,我們看上面的**好像一切都是正常是吧,來我們試試執行的結果如何。額~,程式出現崩潰,檢視錯誤test1已經變為空指標了,哈哈,古怪的想象就這樣出現了。別再盯著這部分的**了,你從這裡是看不出這個現象出現的原因的,為了弄清這個古怪的現象我翻出了auto_ptr智慧型指標的原始碼。
3.auto_ptr賦值操作產生古怪現象的原因
template
<
class
_ty>
class
auto_ptr
_ty *
release()
_throw0()
}
從auto_ptr的拷貝建構函式中我們可以看出,在被拷貝物件拷貝到物件中時,被拷貝物件會先呼叫release函式釋放掉自己的指標,將其設定為0,看到這裡我們就可以清楚了為什麼賦值時會產生這樣古怪的想象了吧。
想想它為什麼會這樣做呢,其實很容易能想到,我們在賦值時如不將被拷貝的物件設定為0,就會出現這兩個智慧型指標在呼叫析構函式時都會釋放相同的堆記憶體,對同乙個堆記憶體delete兩遍造成的問題可以想象得到。
好了,我們既知道了這樣使用auto_ptr智慧型指標會造成這樣的問題,還有它為何需要這樣做,那我們就應該在使用它時規避掉這樣的風險。特別提一句,盡量不要在vector等容器中使用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...
stl智慧型指標auto ptr
感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...