本文介紹四種智慧型指標,
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.引入智慧型指標原因 總的來說,是防止程式執行流的改變 或者人為因素...