C 智慧型指標簡單解析及用法

2021-10-23 03:18:38 字數 3700 閱讀 7892

本文介紹四種智慧型指標,

auto_ptr(c++11已棄用)、unique_ptr、shared_ptr 和 weak_ptr

智慧型指標作用:幫助管理資源,避免記憶體洩漏

雖然已棄用,但仍可使用。

先看例子

#include

#include

using

namespace std;

class

mypoint

~mypoint()

void

print_out()

string print_content;};

void

example()

}int

main()

使用auto_ptr需要先包含memory標頭檔案,可以通過get()獲得裸指標。

從上面可以看出,我們並不用delete new 出來的mypoint了

有以下注意事項:

#include

#include

using

namespace std;

class

mypoint

~mypoint()

void

print_out()

string print_content;};

void

example1()

}int

main()

上面這個例子編譯能通過,但是執行的時候會崩潰,原因在使用

au_smart2 = au_smart1;

的時候,au_smart2已經指向au_smart1指向的位址,並且獲得所有權,au_smart1無權再訪問它原本所指向的記憶體,所以au_smart1再想訪問物件的成員函式時候,就會崩潰。

如果想提前手動釋放auto_ptr管理的記憶體,有如下方式

void

example2()

}void

example3()

}//reset()方法:如果不傳遞引數或傳遞null,則智慧型指標會釋放記憶體。

// 如果傳遞的是乙個物件,則智慧型指標會釋放當前物件,從而管理傳遞進來的物件

void

example4()

}

shared_ptr提供乙個 use_count() 指標計數功能,每被引用一次,use_count()返回值+1,使用完成一次,use_count()返回值-1

shared_ptr可以使用 * 的方式獲取裸指標,可以使用 get() 方法獲取裸指標,或者直接使用 -> 去訪問物件內容

#include

#include

using

namespace std;

class

mypoint

~mypoint()

void

print_out()

string print_content;};

void

testshare_pointer

(shared_ptr a)

void

example()

cout <<

"shared_ptr use:"

<< shared_smart.

use_count()

<< endl;

testshare_pointer

(shared_smart)

; cout <<

"shared_ptr use:"

<< shared_smart.

use_count()

<< endl;

//在上面函式結束後,引用次數-1

}int

main()

上例輸出結果:

mypoint的有參構造

haha

shared_ptr use:1

haha

shared_ptr use:2

shared_ptr use:1

mypoint的析構

在上述例子中,未拷貝shared_smart前,shared_smart的引用次數為1,在傳進testshare_pointer後,shared_smart的引用次數+1,當testshare_pointer結束後,

shared_smart的引用次數-1。

shared_ptr的最佳應用場合顧名思義即是我們需要共享某物件的時候就使用它,還可以使用use_count()檢視當前物件引用次數,非常方便管理

weak_ptr一般與shared_ptr搭配使用,shared_ptr可以直接賦值給weak_ptr,但是shared_ptr的引用計數並不會增加,所以它的用處可以是對shared_ptr進行觀察。

如基類定義乙個weak_ptr用於指向子類的shared_ptr,基類可通過觀察自身weak_ptr就可以知道子類是否對自身進行操作,便於管理物件

#include

#include

using

namespace std;

class

mypoint

~mypoint()

void

print_out()

string print_content;};

void

example()

intmain()

輸出結果:

mypoint的有參構造

shared_ptr use:1

shared_ptr use:1

mypoint的析構

可以看出當weak_smart 指向shared_smart後,shared_smart的引用次數並沒有增加。

unique_ptr可以說是棄用auto_ptr的代替品,unique顧名思義某個時刻只能有乙個unique_ptr指向乙個給定物件,當unique_ptr被銷毀時,物件也被銷毀。

#include

#include

using

namespace std;

class

mypoint

~mypoint()

void

print_out()

string print_content;};

void

example()

intmain()

輸出結果:

mypoint的有參構造

before transform:

unique_smart1 address: 0x7ab698

unique_smart2 address: 0

after transform:

unique_smart1 address: 0

unique_smart2 address: 0x7ab698

mypoint的析構

乙個時刻只能有乙個unique_ptr指向乙個給定物件,所以當unique_smart1使用move()方法之後,unique_smart1立刻被銷毀,從結果可以看到unique_smart1的位址指向了0,unique_smart2指向了unique_smart1原本指向的位址

C 智慧型指標用法小結

智慧型指標的出現,讓很多記憶體洩漏的隱患降低了不少,但是本人真的非常非常不推薦大面積鋪開使用智慧型指標這個東西,這個東西一是效能不如老老實實new delete,而且一旦沒用用好,反而適得其反。但是畢竟智慧型指標也是很多人在用,作為複習進行一下小結。已經完全可以淘汰的auto ptr就不說了,沒人會...

C 智慧型指標 shared ptr用法

主要如下 1 建立出來後,在生命週期結束後自動釋放並呼叫物件的析構函式。2 理解shared的意義,多個智慧型指標可以共享乙個物件,其體現在shared ptr的use count 計數上,每多乙個智慧型指標,計數就加1,每結束乙個智慧型指標則減1,只有當use count 為0時這個指標指向空間才...

智慧型指標及其解析

1.智慧型指標 智慧型指標就是智慧型的 自動化的管理指標所指向的動態資源的釋放,並且可以如同指標一樣使用。智慧型指標是rall 初始化立即獲取資源 思想的一種實現,其中初始化利用建構函式,之後將資源儲存起來最後讓析構函式自動清理。2.引入智慧型指標原因 總的來說,是防止程式執行流的改變 或者人為因素...