C 智慧型指標

2021-09-23 22:52:17 字數 2396 閱讀 9708

由於動態記憶體使用很容易出問題,例如忘記了釋放記憶體造成記憶體洩漏,釋放正在使用的記憶體造成非法記憶體訪問等,為了更容易和安全地使用動態記憶體,標準庫提供了三種智慧型指標來管理動態物件,shared_ptr允許多個智慧型指標指向同乙個物件,unique_ptr則獨佔所指向的物件,weak_ptr是一種弱引用,指向shared_ptr所管理的物件。

智慧型指標也是模板,當我們建立智慧型指標時,必須提供指標可以指向的型別。智慧型指標的使用方式與普通指標類似,解引用乙個智慧型指標返回它指向的物件,條件判斷中使用智慧型指標的效果就是檢測它是否為空。

最安全的分配和使用動態記憶體的方法是呼叫乙個名為make_shared的標準庫函式。

int

main()

auto str = make_shared(8

,'6');

cout <<

*str << endl;

system

("pause");

}

當進行拷貝或賦值操作時,每個shared_ptr都會記錄有多少個其它shared_ptr指向相同的物件,當引用計數為0時,shared_ptr會自動釋放自己管理的物件。

int

main()

//返回指向物件的shared_ptr數量

cout << p.

use_count()

<< endl;

auto a = p;

cout << p.

use_count()

<< endl;

system

("pause");

}

我們還可以使用new返回的指標來初始化智慧型指標,接受指標引數的建構函式是explicit的,必須使用直接初始化來初始化乙個智慧型指標。

//正確

shared_ptr<

int>

p1(new int(33

));//錯誤,必須使用直接初始化,接受指標引數的建構函式是explicit的

shared_ptr<

int> p2=new int(44

);

由於shared_ptr會自動釋放記憶體,所以不要混用普通指標和智慧型指標,否則可能導致錯誤。

void

printint

(shared_ptr<

int> p)

intmain()

智慧型指標定義了乙個名為get的函式返回原始指標,只有你確定不會delete指標的情況下才能使用get,尤其是永遠也不要用get初始化另乙個智慧型指標或為另乙個智慧型指標賦值。

int

main()

與賦值類似,reset可以將管理的指標置空或使之指向另外乙個指標,並更新引用計數。

int

main()

預設情況下,當乙個shared_ptr要銷毀它指向的物件時,會執行delete操作,我們也可以使用自定義的函式代替delete。

class myclass

;void

mydelete

(myclass* obj)

void

testfunc()

intmain()

和shared_ptr不同,同一時刻只能有乙個unique_ptr指向給定的物件,當unique_ptr被銷毀時,它所指向的物件也隨之銷毀,unique_ptr不支援拷貝和賦值。

unique_ptr大部分操作和shared_ptr類似,只是如果想要替換預設delete方法,需要在建立時提供替換函式的型別。

class myclass

;void

mydelete

(myclass* obj)

void

testfunc()

intmain()

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

int

main()

system

("pause");

}

由於在棧上分配的物件會自動銷毀,即使中途發生異常,所以智慧型指標也能利用這一特性確保異常發生後物件能正常釋放。

class myclass};

void

testfunc()

intmain()

catch(.

..)system

("pause");

}

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 智慧型指標

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