智能指針是存儲(chǔ)指向動(dòng)態(tài)分配(堆)對(duì)象指針的類,確保離開指針?biāo)诘淖饔糜驎r(shí),自動(dòng)銷毀動(dòng)態(tài)分配的對(duì)象,防止內(nèi)存泄漏。智能指針實(shí)現(xiàn)的核心技術(shù)是引用計(jì)數(shù),每使用一次,內(nèi)部引用計(jì)數(shù)加1,每析構(gòu)一次內(nèi)部引用計(jì)數(shù)減1,減為0時(shí),刪除所指向的堆內(nèi)存。
創(chuàng)新互聯(lián)是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護(hù)、網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站備案、服務(wù)器租用、域名注冊(cè)、軟件開發(fā)、成都小程序開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運(yùn)營推廣經(jīng)驗(yàn)的科技公司,有著多年的網(wǎng)站建站經(jīng)驗(yàn),致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個(gè)面向全國乃至全球的業(yè)務(wù)窗口:建站咨詢電話:13518219792? 智能指針使用需要包含頭文件
1.共享智能指針shared_ptr
shared_ptr是個(gè)模板類,可以通過構(gòu)造函數(shù)、reset、shared_ptr輔助函數(shù)初始化
use_count查看引用計(jì)數(shù)、get方法獲取原始指針
//構(gòu)造函數(shù)初始化
//shared_ptr智能指針名字 (創(chuàng)建堆內(nèi)存);//構(gòu)造函數(shù)初始化
// 拷貝、移動(dòng)構(gòu)造函數(shù)初始化
// make_shared初始化
//template// shared_ptrmake_shared(Args .... args)
//reset構(gòu)造函數(shù)初始化
//void reset() noexcept;
//template//void reset(Y *ptr);
//template//void reset(Y* ptr, Deleter d);
//template//void reset(Y* ptr, Deleter d,Alloc alloc);
//prt指向要獲取所有權(quán)的對(duì)象指針,d指向要獲取所有權(quán)的對(duì)象指針,alloc內(nèi)部存儲(chǔ)器所用的分配器
//獲取原始指針
//T *get() const noexcept;
//構(gòu)造函數(shù)初始化
shared_ptrptr1(new int(3));
// 移動(dòng)構(gòu)造函數(shù)初始化
shared_ptrptr2 = move(ptr1);
// 拷貝構(gòu)造函數(shù)初始化
shared_ptrptr3 = ptr2;
// make_shared初始化
shared_ptrptr4 = make_shared(4);
shared_ptrptr5 = make_shared(4);
shared_ptrptr6 = make_shared("hello,world");
//reset構(gòu)造函數(shù)初始化
ptr6.reset();
ptr5.reset(new EPtr(99));
//獲取原始指針使用
EPtr* t = ptr5.get();
t->set(1000);
t->pritf();
//智能指針使用
ptr5->set(999);
ptr5->pritf();
cout<< endl;
智能指針刪除器
? 當(dāng)智能指針引用計(jì)數(shù)為0時(shí),會(huì)自動(dòng)釋放內(nèi)存。也可以指定在初始化智能指針時(shí)指定刪除器函數(shù)(本質(zhì)為回調(diào)函數(shù)),一般為lambda表達(dá)式。管理數(shù)組的智能指針必須指定刪除器函數(shù)(也可以使用C++的srd::default_delete
//shared_ptrppp2(new EPtr[3]);//只釋放一次
//cout<< endl;
shared_ptrppp3(new EPtr[3], [](EPtr* ptr) {
cout<< "數(shù)組必須指定刪除器函數(shù) -----------------"<< endl;
delete[] ptr;
});
cout<< endl;
shared_ptrppp5(new EPtr[3],default_delete());
std::cout<< endl;
shared_ptrppp4(new int[3], default_delete());
cout<< endl;
注意事項(xiàng):
? 不能使用一個(gè)地址初始化多個(gè)共享智能指針(通過智能指針給智能指針賦值解決)
? 函數(shù)不能管理返回this的共享智能指針對(duì)象(通過weak_ptr解決)
?????共享智能指針不能循環(huán)引用(通過weak_ptr解決)
2.獨(dú)占智能指針unique_ptr
? 內(nèi)部引用計(jì)數(shù)為1,如另一個(gè)智能指針需要使用這塊對(duì)內(nèi)存,是需要使用move函數(shù)來轉(zhuǎn)移
? 不允許將一個(gè)unique_ptr賦值給另一個(gè)unique_ptr
//構(gòu)造函數(shù)初始化
unique_ptrptr1(new int(3));
// 移動(dòng)構(gòu)造函數(shù)初始化
unique_ptrptr2 = move(ptr1);
//reset構(gòu)造函數(shù)初始化
ptr2.reset();
ptr2.reset(new int(99));
//獲取原始指針使用
unique_ptrptr3(new EPtr(4));
EPtr* t = ptr3.get();
t->set(100);
t->pritf();
? 指定刪除器不一樣,需要在<>里面加入刪除器函數(shù)類型
using funPtr = void(*)(EPtr *);
unique_ptrptr3(new EPtr("HELLO"), [](EPtr* t) {
cout<< "test_unique_ptrDelete---------"<< endl;
delete t; });
//c11中unique_ptr能自動(dòng)申請(qǐng)與釋放數(shù)組地址
unique_ptrptr4(new EPtr[3]);
//c11中shared_ptr不支持下面方法,才c11后才支持
shared_ptrptr5(new EPtr[3]);
3.弱引用之智能指針weak_ptr
? 不共享指針,不操作資源,來監(jiān)視shared_ptr(協(xié)調(diào)shared_ptr),主要解決返回this的shared_ptr與循環(huán)引用問題
use_count:獲取shared_ptr內(nèi)的引用計(jì)數(shù)
expired:判斷資源是否被釋放,true-釋放,false-沒有釋放
lock:獲取shared_ptr的資源對(duì)象
reset:釋放,讓其不監(jiān)視shared_ptr的資源
class MyClassPtr :public enable_shared_from_this{
public:
shared_ptrgetPtr() {
//return shared_ptr(this);
return shared_from_this();
}
~MyClassPtr() {
cout<< "析構(gòu)"<ptr1 (objPtr);
//不能使用一個(gè)地址初始化多個(gè)共享智能指針,會(huì)釋放多次
//shared_ptrptr2(objPtr);//error
shared_ptrptr2 = ptr1;
shared_ptrsptr1(new MyClassPtr);
cout<< "引用計(jì)數(shù) = "<通過shared_from_this()方法來返回共享智能指針
//shared_from_this函數(shù)內(nèi)部通過weak_ptr的lock()返回shared_ptr對(duì)象
shared_ptrsptr2 = sptr1->getPtr();
cout<< "引用計(jì)數(shù) = "<< sptr2.use_count()<< endl;
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:C++11特性-智能指針-創(chuàng)新互聯(lián)
分享URL:http://www.rwnh.cn/article30/dghjso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站策劃、動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站改版、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容