C 基礎回顧4 智慧型指標shared ptr

2021-08-20 11:54:15 字數 2375 閱讀 8733

———-引入智慧型指標的目的,個人;理解有如下兩點:

1.自動釋放記憶體:智慧型指標類能記錄多少個shared_ptr指向相同的物件,並在引用計數值為0時自動釋放物件所占用的記憶體。

2.記憶體共享:讓多個物件共享底層資料。

c++動態記憶體(malloc & free, new & delete)

程式使用動態記憶體出於以下三種原因之一:

vector

v1;

;int size = sizeof(str) / sizeof(str[0]);

vector

v2(str, str + size);

v1 = v2;

}//v2被銷毀,v1中包含三個元素

當拷貝乙份vector時,原vector和副本vector中元素是相互分離的。

一般而言,如果兩個物件共享底層的資料,當某個物件被銷毀時,我們不能當方面的銷毀底層資料。

blob b1;

;b1 = b2;//b1和b2共享相同的元素

}

物件b1與b2具有引用相同的底層元素。

實現blob類如下:

class strblob

; bool empty() const;

//新增和刪除元素

void push_back(const

string &t) ;

void pop_back();

private:

shared_ptr

> data;

void check(size_type i, const

string &msg) const;

}

shared_ptr與new的結合使用

預設情況下,乙個用來初始化智慧型指標的普通指標必須指向動態記憶體,因為智慧型指標預設使用delete釋放它所關聯的物件。

shared_ptr

clone(int p)

不要混合使用普通指標和智慧型指標

void  process(shared_ptr

ptr)

//ptr離開作用域,被銷毀

process採用傳值方式傳遞形參,因此實參會被拷貝給乙個臨時變數ptr,拷貝實參會遞增引用計數。

shared_ptr

p(new

int(42));//引用計數為1;

process(p); //引用計數為2,執行完process後引用計數變為1

int i = *p;//p的引用計數為1;

智慧型指標刪除器

struct destination;

struct connection;

connection connect(destination *d);

void disconnection(connection);

void f(destination *dd)

以上**中若connection存在析構函式,還可以在析構函式中呼叫disconnect。但是不存在析構函式,就可以使用shared_ptr,與採用shared_ptr自動會呼叫delete避免記憶體洩漏的原理是一樣的。

修改如下:

void end_connection(destionation *d);

void f(destination *dd)

某一時刻只能有乙個unique_ptr指向乙個給定物件,unique_ptr與物件是一一對應的關係。
unique_ptr p1(new

string("stegosaurus"));

unique_ptr p2(p1); //錯誤:unique_ptr不支援拷貝,unique_ptr沒有對應的拷貝建構函式

unique_ptr p3;

p3 = p2; //錯誤:unique_ptr不支援拷貝,unique_ptr沒有對應的拷貝建構函式

unique_ptr操作

p2.release();//錯誤:p2不會釋放記憶體,而且我們丟失了指標

auto p = p2.release(); //正確,用完後必須delete(p)

weak_ptr操作

weak_ptr是一種不控制所指向物件生命週期的智慧型指標,它指向乙個由shared_ptr管理的物件,將乙個weak_ptr繫結到shared_ptr上不會改變shared_ptr的引用計數。

c 基礎 智慧型指標

設計原理 將基本型別指標封裝為類物件指標 這個類肯定是個模板,以適應不同基本型別的需求 並在析構函式裡編寫delete語句刪除指標指向的記憶體空間。auto ptr 則c 會把m example所指向的記憶體 使m example1 的值為null,所以在c 中,應絕對避免把auto ptr放到容器...

c 基礎 使用智慧型指標

三個智慧型指標模板 auto ptr unique ptr和shard ptr 都定義了類似指標的物件 c 11已將auto ptr摒棄 可以將new獲得 直接或間接 的位址賦給這種物件。當智慧型指標過期時,其析構函式將使用delete來釋放記憶體。因此,如果將new返回的位址賦給 這些物件,將無需...

c 智慧型指標基礎詳解

在現代 c 程式設計中,標準庫包含了智慧型指標 smart pointers 智慧型指標用來確保程式不會出現記憶體和資源的洩漏,並且是 異常安全 exception safe 的。智慧型指標定義在標頭檔案 memory 裡的命名空間 std 中。它對於資源獲取即初始化 raii,resource a...