智慧型指標shared_ptr的用法,為了解決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_ptr p4 = new int(1);// error reset()有兩種操作。當智慧型指標中有值的時候,呼叫reset()會使引用計數減1.當呼叫reset(new ***())重新賦值時,智慧型指標首先是生成新物件,然後將就物件的引用計數減1(當然,如果發現引用計數為0時,則析構舊物件),然後將新物件的指標交給智慧型指標保管。
獲取原始指標
std::shared_ptr p4(new int(5));
int *pint = p4.get();指定刪除器
智慧型指標可以指定刪除器,當智慧型指標的引用計數為0時,自動呼叫指定的刪除器來釋放記憶體。std::shared_ptr可以指定刪除器的乙個原因是其預設刪除器不支援陣列物件,這一點需要注意。
2. 使用shared_ptr需要注意的問題
但凡一些高階的用法,使用時都有不少陷阱。
不要用乙個原始指標初始化多個shared_ptr,原因在於,會造成二次銷毀,如下所示:
int *p5 = new int;
std::shared_ptr p6(p5);
std::shared_ptr p7(p5);// logic error不要在函式實參中建立shared_ptr。因為c++的函式引數的計算順序在不同的編譯器下是不同的。正確的做法是先建立好,然後再傳入。
function(shared_ptr(new int), g());
禁止通過shared_from_this()返回this指標,這樣做可能也會造成二次析構。
避免迴圈引用。智慧型指標最大的乙個陷阱是迴圈引用,迴圈引用會導致記憶體洩漏。解決方法是astruct或bstruct改為weak_ptr。
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...