智慧型指標shared ptr的用法

2021-07-26 16:28:38 字數 1393 閱讀 6155

為了解決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(new

int(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 = new

int(1);// error

當智慧型指標中有值的時候,呼叫reset會使引用計數減1.

std::shared_ptr p4(new

int(5

));

int *pint = p4.get();

智慧型指標可以指定刪除器,當智慧型指標的引用計數為0時,自動呼叫指定的刪除器來釋放記憶體。std::shared_ptr可以指定刪除器的乙個原因是其預設刪除器不支援陣列物件,這一點需要注意。

2.使用shared_ptr需要注意的問題

但凡一些高階的用法,使用時都有不少陷阱。

function(shared_ptr(new

int), g());

struct

astruct;

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...