auto_ptr包含於標頭檔案 #include其中這些庫中也存有。auto_ptr 能夠方便的管理單個堆記憶體物件,在你不用的時候自動幫你釋放記憶體。
auto_ptr的設計目的:
因此,這會出現一些麻煩,如我們忘掉delete,或者return語句在delete之前,例如:
1 #include2在沒有delete之前函式已經返回。同時,如果此函式有異常出現時,函式將立刻退離,根本不會呼叫函式尾端的delete語句,這就會使記憶體遺失。當然我們也可以防止這種情況發生那就是在函式中用try。。catch語句,但是這回顯的程式很複雜和累贅。using
namespace
std;
3int
main()
4
如果使用智慧型指標,無論在任何情況下,只要自身摧毀就一定會釋放資源。因為智慧型指標原理就是將指標轉換為類物件,由於物件被銷毀會自動呼叫類中的析構函式,釋放物件所指向的記憶體空間從而達到自動釋放資源的目的。
注意:auto_ptr它是「它所指向的物件」的擁有者。所以。當身為物件擁有者的auto_ptr被摧毀,auto_ptr要求乙個物件只有乙個擁有者,嚴禁一物二主(之後的擁有權轉移也會提到)
乙個版本的auto_ptr是linux和vs中使用的,另乙個是vc版本的,下面是vc版本的auto_ptr的源**剖析:
c中的auto_ptr:
原始碼:
vc:解析**:template
class
auto_ptr
auto_ptr(
const auto_ptr<_ty>&_y) _throw0()
: _owns(_y._owns), _ptr(_y.release()) {}
auto_ptr
<_ty>& operator=(const auto_ptr<_ty>&_y) _throw0()
else
if(_y._owns)
_owns = true
; _ptr =_y.release(); }
return (*this
); }
~auto_ptr()
_ty& operator*() const
_throw0()
_ty *operator->() const
_throw0()
_ty *get() const
_throw0()
_ty *release() const
_throw0()
private
:
bool
_owns;
_ty *_ptr;
};
1.
#include #include執行結果:intmain()
由於沒有用delete釋放記憶體空間,所以造成記憶體空間浪費了四個位元組。
2.
#includeusingauto_ptr(const auto_ptr<_ty>&_y):_owns(_y._owns),_ptr(_y.release()){}//此處的const並非意味你不能更改auto_ptr所擁有的物件,而是意味你不能更改auto_ptr的擁有權。(通俗講就是如果使用const auto_ptr作為引數,對新物件的任何賦值操作都將導致編譯期錯誤。就常數特性而言,const auto_ptr比較類似常數指標(t*const p),而非指向常數的指標(const t*p)——儘管其語法看上去比較像後者。所以_y.release()改變了_y.owns的值不影響函式執行。namespace
std;
class
test
};template
class
auto_ptr
auto_ptr(
const auto_ptr<_ty>&_y):_owns(_y._owns),_ptr(_y.release()){}
auto_ptr
<_ty>&operator=(const auto_ptr<_ty>&_y)//
賦值運算子過載
else
if(_y._owns)
_owns = true
; _ptr = _y.release(); //
修改_y的擁有權,並將_y的_ptr賦值給該成員_ptr從而使該物件具有_y._ptr指向空間的擁有權
}
return (*this
); }
_ty& operator*()
_ty* operator->()
_ty*release()const
~auto_ptr()
private
:
bool _owns;//
擁有權 _ty *_ptr;
};int
main()
1 _ty*release()const同時這裡因為函式是const修飾的常函式所以不能對其進行修改,但是((auto_ptr<_ty>*)this)其意義是將const (auto_ptr<_ty>*)型別強制轉換為(atuo_ptr<_ty>型別,這樣就可以對_owns進行修改,但是這只能在強制之時進行修改,一旦執行完強轉其型別依然變為原來的const (auto_ptr<_ty>*)型別,使其它方法無法修改其中資料。2
執行結果 :
no memory leaks 無記憶體洩漏
這裡有一些問題,為什麼*pal的擁有權已經轉移卻還能輸出呢?因為vc版的auot_ptr就是將擁有權轉移後,除了不能夠對其多次析構外,還可以對其進行操作,這就不好了,你都已經分手了,還不放手。在vs版本上對擁有權有更好的管理。
智慧型指標(簡單版)
include 智慧型指標,物件導向的指標。該指標可以實現自動 記憶體的功能。通過將指標交給物件來管理,物件放到棧中,棧由系統進行管理,來實現自動 功能,獨闢蹊徑,妙啊。實現該智慧型指標的主要問題在於運算子的過載上。template class smartptr smartptr t operato...
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
vc版auto ptr智慧型指標實現
define crt secure no warnings include include include include using namespace std template class ty class autoptr 拷貝建構函式,呼叫 y.release 保證在 ptr成員賦值時擁有權轉...