對C/C++學習感興趣的可以看看這篇文章哦:C/C++教程
本章主要介紹C/C++中智能指針的使用方法
一、什么是智能指針?C/C++中,指針是一個非常重要的概念,其強大但也麻煩
麻煩之處就在于一旦你申請了內(nèi)存,那就必須要手動去釋放內(nèi)容,否則就會造成內(nèi)存泄漏
當然了,在代碼量少的情況下你可能會不以為意,因為這點內(nèi)存即使泄露了也根本看不出來,而且一旦程序執(zhí)行結(jié)束,所有內(nèi)存都會被系統(tǒng)釋放
但如果一旦寫比較大點的項目,內(nèi)存管理就顯得很重要了,比如QQ,微信等等,一般都是一直掛著的
如果掛幾個小時就把電腦內(nèi)存耗干凈了,瞬間電腦變卡,誰還用啊
所以智能指針的作用就是防止我們麻痹大意忘記釋放內(nèi)存,幫助我們管理內(nèi)存的
二、使用方法當然也有多次釋放一個指針,導致程序崩潰的問題也能就此解決
雖然智能指針聽著很高級,但使用起來并不算復雜,熟悉之后,其實和普通指針差別不大。但會更加好用
自C++11之后,智能指針共有三個:shared_ptr
、unique_ptr
、weak_ptr
看名字就知道,它是可以分享的指針,其使用方法很簡單:
比如這里有一個類:
class User {public:
User() {cout<< "這是構(gòu)造函數(shù)"<< endl;
}
~User()
{cout<< "這是析構(gòu)函數(shù)"<< endl;
}
void TestFun() {cout<< "這是一個測試函數(shù)"<< endl;
}
};
然后使用共享智能指針:
#includeusing namespace std;
//上面的那個類可以放在這里
int main() {shared_ptrp(new User());
shared_ptrp1 = p;
shared_ptrp2 = p;
p->TestFun(); //調(diào)用函數(shù)的方式和指針一樣
cout<< p.use_count()<< endl; //輸出共享個數(shù)
}
即:通過模板參數(shù),傳入要構(gòu)造的指針類型,然后在初始化的時候,就可以直接new
一個對象即可
因為是共享的,所以它還能互相賦值,并可以用函數(shù)use_count
返回當前共享的個數(shù)
其使用方法,如調(diào)用類的函數(shù)和屬性之類的,就和普通的指針一樣,用->
進行調(diào)用即可,但是卻不需要我們?nèi)ビH自清理內(nèi)存了!
看,現(xiàn)在我們并沒有清理內(nèi)存,但這個類的析構(gòu)函數(shù)卻被調(diào)用了!這就說明內(nèi)存已經(jīng)被正常釋放了
這就是智能指針的好處!
但智能指針寫著有點麻煩,每次聲明其類型都有一長串,所以一般我們會對指針進行重定義,達到簡化的目的:
typedef shared_ptrSPUser;
int main() {SPUser p(new User());
SPUser p1 = p;
SPUser p2 = p;
p->TestFun(); //調(diào)用函數(shù)的方式和指針一樣
cout<< p.use_count()<< endl; //輸出共享個數(shù)
}
2.unique_ptr上面的共享指針的使用方法和普通指針區(qū)別并不大
但有時候,我們想要某個對象同時只能存在一份,即不允許像共享指針那樣,可以到處隨意賦值給別人
這時候就可以用unique_ptr
,其使用方法如下:
typedef unique_ptrUPUser; //重新定義一個名稱,便于使用
int main() {UPUser p(new User);
//UPUser p1 = p; //錯誤,不能進行賦值
UPUser p2;
p2.swap(p); //但可以交換,即p2現(xiàn)在保存有變量,但p變?yōu)榱丝罩羔? if (p == nullptr) {cout<< "p為空指針"<< endl;
}
p2->TestFun(); //正常調(diào)用
UPUser p3 = move(p2); //也可以用move函數(shù)移動
if (p2 == nullptr) {//此時p2就是空指針
cout<< "p2為空指針"<< endl;
}
p3->TestFun(); //p3則保存對象指針
}
可以看到,它的使用方法其實和共享指針是差不多的,唯一不同之處就是,它內(nèi)部的指針值,同一時刻只能存在一份
即,你不能對它進行任何形式的復制,但是可以移動
3.weak_ptr這個智能指針用的不太多,因為它本身并沒有太多實際的用途,而是主要作為shared_ptr
的一個輔助類存在
比如有多少指向相同的
shared_ptr
指針、shared_ptr
指針指向的堆內(nèi)存是否已經(jīng)被釋放等等。
其使用方法如下:
typedef shared_ptrSPUser;
typedef weak_ptrWPUser;
int main() { SPUser p(new User());
SPUser p1 = p;
SPUser p2 = p;
WPUser wp(p);
cout<< wp.use_count()<< endl; //查看這個共享指針使用次數(shù)
cout<< wp.expired()<< endl; //判斷這個指針是否為空,或者內(nèi)存已經(jīng)被釋放
}
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當前標題:C/C++智能指針詳解-創(chuàng)新互聯(lián)
分享URL:http://www.chinadenli.net/article2/djsoic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站改版、建站公司、企業(yè)建站、商城網(wǎng)站、云服務器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容