多執行緒的利器 C 智慧型指標

2021-10-23 06:23:05 字數 2854 閱讀 6789

c++給程式人員提供很多的權力,自然也就要完成很多的任務。最典型的就是c++的記憶體沒有自動**機制,所以要求程式設計師每次new&delete,不匹配則容易造成記憶體洩漏。

因此c++引入智慧型指標,是raii(利用的就是c++構造的物件最終會被銷毀的原則。raii的做法是使用乙個物件,在其構造時獲取對應的資源,在物件生命期內控制對資源的訪問,使之始終保持有效,最後在物件析構的時候,釋放構造時獲取的資源。)的一種應用,可用於動態資源管理,資源即物件的管理策略。標頭檔案為中std命名空間中定義,

只允許基礎指標的乙個所有者。可以移到新所有者,但不會複製或共享,

獨佔式擁有或嚴格擁有概念。

std::unique_ptrp(

newstring

("unique"))

;std::unique_ptr q;

q=p;

//此時試圖複製p物件,出錯,**

****

***q=

move

(p);

//此時通過移動將p物件的所有權交給q

unique_ptr還是比較簡單的,它多出了異常機制,這是普通指標所無法達到的。在想操作獨佔式物件時,讓程式設計師更清楚地知道自己在幹什麼事情,而不是像普通指標一樣,憑記憶來操作。

如同其名,share式擁有。多個智慧型指標指向相同的物件,該物件和其相關的資源會在最後乙個引用被銷毀的時候釋放。那麼就需要計數來知道有多少個智慧型指標在共享這個物件。

操作函式:

ues_count:返回引用計數的個數

unique:返回是否是獨佔所有權,use_count為1的時候

swap:交換兩個shared_ptr物件

reset:放棄內部物件的所有權或擁有物件的變更,會使引用計數減少

get:返回內部物件(指標)

//shared_ptr的建立有兩種方法

shared_ptr<

int> p1=make_shared<

int>(1

);//根據傳遞引數呼叫動態物件的建構函式

shared_ptr<

int>p2(

newint(2

));//原生構造**

****

****

****

****

****

****

****

****

****

****

****

****

****

****

//總例子示範

intmain()

基於shared_ptr的乙個漏洞而出現的指標:shared_ptr已經解決了很多問題,但是當兩個物件相互使用乙個shared_ptr成員變數指向對方的時候,會出現迴圈引用的情況,此時計數會失效。

#include

#include

#include

using

namespace std;

class

parent

;class

children

;class

parent

public

: std::shared_ptr child;};

class

children

public

: std::shared_ptr parent;};

void

verify()

intmain()

我們在parent中,構造了乙個child的shared_ptr。在child中構造了乙個parent的。

這時候想釋放parent,但是child裡保留了parent的引用。先釋放child也不行。這就是迴圈引用現象。

這時候就weak_ptr出馬了,它不控制物件的生命週期,指向乙個shared_ptr管理的物件,只提供乙個訪問管理物件的手段。weak_ptr的引入不會增加計數,和shared_ptr之間可以相互轉化,shared_ptr可以賦值給它,它也可以通過呼叫lock函式來獲取shared_ptr.

class

parent

public

: std::shared_ptr child;};

class

children

public

: std::weak_ptr parent;

// 替換成「弱引用」};

可以看到,析構成功。

操作函式:

weak_ptr 沒有過載*和->但可以使用 lock 獲得乙個可用的 shared_ptr 物件. 注意, weak_ptr 在使用前需要檢查合法性.

expired 用於檢測所管理的物件是否已經釋放, 如果已經釋放, 返回 true; 否則返回 false.

lock 用於獲取所管理的物件的強引用(shared_ptr). 如果 expired 為 true, 返回乙個空的 shared_ptr; 否則返回乙個 shared_ptr, 其內部物件指向與 weak_ptr 相同.

use_count 返回與 shared_ptr 共享的物件的引用計數.

reset 將 weak_ptr 置空.

weak_ptr 支援拷貝或賦值, 但不會影響對應的 shared_ptr 內部物件的計數.

具體的使用還是要到場景中來才有意義,智慧型指標是乙個好東西,但用不用,怎麼用都是設計者要思考的東西。

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...