在普通指標使用時,需要記住分配的記憶體手動釋放,否則就會造成記憶體洩漏。
智慧型指標的用途是幫助程式設計師,管理記憶體資源的一種方式,不用手動的釋放資源。
智慧型指標是基於raii思想產生的一種控制記憶體程式資源的方式。
raii
raii(resource acquisition is initialization)是一種利用物件生命週期來控制程式資源的簡單技術。
智慧型指標的要求
智慧型指標需要考慮的問題
指標使用時的問題,乙份資源可能不只被乙個指標控制(管理權問題),這就可能導致指標,使用資源和清理資源時出現問題。這就要求智慧型指標需要處理指標的拷貝問題,即資源管理權的問題。
auto_ptr
auto_ptr拷貝時的處理方式時,將資源的管理權交接,這樣會導致原有的指標被懸空,導致解引用異常。
這樣的處理顯然不能讓人滿意,所以auto_ptr並不廣泛實用。
auto_ptr的模擬實現:
template
<
class
t>
//auto_ptr 拷貝思想:管理權轉移,一旦發生拷貝構造,將資源管理權轉移為拷貝的物件
class
autoptr
~autoptr()
autoptr
(autoptr
& ap)
:_ptr
(ap._ptr)
autoptr
&operator
=(autoptr
& ap)
return
*this;}
t&operator*(
) t*
operator
->()
private
: t* _ptr;
};
unique_ptr
unique_ptr解決拷貝問題就顯得簡單粗暴,直接不允許拷貝,也就避免了拷貝會出現問題。
這樣的處理方式,保證了指標使用的安全。
unique_ptr支援自定義deleter,即自定義析構函式。
#include
#include
using
namespace std;
struct my_deleter};
intmain()
unique_ptr的簡單模擬實現:
template
<
class
t>
//uniqueptr 思想:防拷貝
class
uniqueptr
//不允許拷貝 c++11
uniqueptr
(uniqueptr
& uq)
=delete
; uniqueptr
&operator
=(uniqueptr
& uq)
=delete;~
uniqueptr()
t&operator*(
) t*
operator
->()
private
: t* _ptr;
};
shared_ptr
shared_pt使用引用計數支援智慧型指標拷貝。
引用計數:
引用計數會出現執行緒安全問題,這個問題可以通過加鎖解決,這裡不再多加實現。
shared_ptr模擬實現:
template
<
class
t>
//sharedptr 思想: 引用計數支援智慧型指標拷貝
class
sharedptr
sharedptr
(sharedptr
& sp)
:_ptr
(sp._ptr)
,_link_num
(sp._link_num)
,_pmutex
(sp._pmutex)
~sharedptr()
_pmutex-
>
unlock()
;if(deleteflag ==
true)}
sharedptr
&operator
=(sharedptr
& sp)
_ptr = sp._ptr;
_link_num = sp._link_num;
_pmutex = sp._pmutex;
_pmutex-
>
lock()
;++(*_link_num)
; _pmutex-
>
unlock()
;}return
*this;}
t&operator*(
) t*
operator
->()
private
: t* _ptr;
int*_link_num;
mutex* _pmutex;
};
raii的思想不僅用於智慧型指標,還用於實現守衛鎖解決死鎖問題。 c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...