為了解決c++記憶體洩漏的問題,c++11引入了智慧型指標(smart pointer)。
智慧型指標的原理是,接受乙個申請好的記憶體位址,構造乙個儲存在棧上的智慧型指標物件,當程式退出棧的作用域範圍後,由於棧上的變數自動被銷毀,智慧型指標內部儲存的記憶體也就被釋放掉了(除非將智慧型指標儲存起來)。
c++11提供了三種智慧型指標:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用時需新增標頭檔案:
#include
shared_ptr使用引用計數,每乙個shared_ptr的拷貝都指向相同的記憶體。每使用他一次,內部的引用計數加1,每析構一次,內部的引用計數減1,減為0時,刪除所指向的堆記憶體。
shared_ptr的基本用法
可以通過建構函式、std::make_shared輔助函式和reset方法來初始化shared_ptr:
std::shared_ptr p(newint(1
)); std::shared_ptr
p2 =p;
std::shared_ptr
p3 = std::make_shared(5
); std::shared_ptr
ptr;
ptr.reset(
newint(1
));
if(ptr)
注意,不能將乙個原始指標直接賦值給乙個智慧型指標,如下所示,原因是乙個是類,乙個是指標。
std::shared_ptr p4 = newint(1);// error
當智慧型指標中有值的時候,呼叫reset會使引用計數減1.
std::shared_ptr p4(newint(5
));
int *pint = p4.get();
智慧型指標可以指定刪除器,當智慧型指標的引用計數為0時,自動呼叫指定的刪除器來釋放記憶體。std::shared_ptr可以指定刪除器的乙個原因是其預設刪除器不支援陣列物件,這一點需要注意。
2.使用shared_ptr需要注意的問題
但凡一些高階的用法,使用時都有不少陷阱。
function(shared_ptr(newint), g());
structastruct;
struct
bstruct;
struct
astruct
};struct
bstruct
};void
testloopreference()
shared ptr智慧型指標
智慧型指標是乙個行為類似指標的物件。我們在使用堆記憶體時,都需要及時地進行釋放,避免造成記憶體洩漏。但我們偶爾也會忘記將其釋放掉,從而造成記憶體洩漏。並且,在釋放的時候,我們可能對某乙個指標進行了重複釋放,導致程式崩潰的問題。為了能夠解決這些問題,從而有了智慧型指標的設計。智慧型指標一共有四種,分別...
shared ptr(智慧型指標)
只要將 new 運算子返回的指標 p 交給乙個 shared ptr 物件 託管 就不必擔心在 寫delete p語句 實際上根本不需要編寫這條語句,託管 p 的 shared ptr 物件在消亡時會自動執行delete p。而且,該 shared ptr 物件能像指標 p 樣使用,即假設託管 p ...
智慧型指標shared ptr
shared ptr在脫離自己的作用域時候,會自動呼叫析構函式。作用域包含 塊 被呼叫函式 main函式等。include include include include using namespace std class a a int n private int n string str voi...