智慧型指標shared ptr的用法

2021-09-12 17:35:31 字數 1290 閱讀 5437

為了解決c++記憶體洩漏的問題,c++11引入了智慧型指標(smart pointer)。

智慧型指標的原理是,接受乙個申請好的記憶體位址,構造乙個儲存在棧上的智慧型指標物件,當程式退出棧的作用域範圍後,由於棧上的變數自動被銷毀,智慧型指標內部儲存的記憶體也就被釋放掉了(除非將智慧型指標儲存起來)。

c++11提供了三種智慧型指標:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用時需新增標頭檔案。

shared_ptr使用引用計數,每乙個shared_ptr的拷貝都指向相同的記憶體。每使用他一次,內部的引用計數加1,每析構一次,內部的引用計數減1,減為0時,刪除所指向的堆記憶體。shared_ptr內部的引用計數是安全的,但是物件的讀取需要加鎖。

shared_ptr的基本用法

可以通過建構函式、std::make_shared輔助函式和reset方法來初始化shared_ptr:

#include "stdafx.h"

#include #include #include using namespace std;

class person

注意,不能將乙個原始指標直接賦值給乙個智慧型指標,如下所示,原因是乙個是類,乙個是指標。

std::shared_ptrp4 = new int(1);// error
reset()包含兩個操作。當智慧型指標中有值的時候,呼叫reset()會使引用計數減1.當呼叫reset(new ***())重新賦值時,智慧型指標首先是生成新物件,然後將就物件的引用計數減1(當然,如果發現引用計數為0時,則析構舊物件),然後將新物件的指標交給智慧型指標保管。

std::shared_ptrp4(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

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