C++超詳細(xì)講解智能指針
一、內(nèi)存泄漏-永恒的話題
- 動(dòng)態(tài)申請(qǐng)堆空間,用完后不歸還
- C++ 語(yǔ)言中沒(méi)有垃圾回收的機(jī)制
- 指針無(wú)法控制所指堆空間的生命周期
下面看一段內(nèi)存泄漏的代碼:
#include <iostream> #include <string> using namespace std; class Test { int i; public: Test(int i) { this->i = i; } int value() { return i; } ~Test() { } }; int main() { for(int i=0; i<5; i++) { Test* p = new Test(i); cout << p->value() << endl; } return 0; }
輸出結(jié)果如下:
二、深度思考
- 需要一個(gè)特殊的指針
- 指針生命周期結(jié)束時(shí)主動(dòng)釋放堆空間
- 一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)
- 杜絕指針運(yùn)算和指針比較
三、智能指針?lè)治?/h2>
解決方案
- 重載指針特征操作符( -> 和 * )
- 只能通過(guò)類(lèi)的成員函數(shù)重載
- 重載函數(shù)不能使用參數(shù)
- 只能定義一個(gè)重載函數(shù)
下面看一段智能指針的使用示例:
#include <iostream> #include <string> using namespace std; class Test { int i; public: Test(int i) { cout << "Test(int i)" << endl; this->i = i; } int value() { return i; } ~Test() { cout << "~Test()" << endl; } }; class Pointer { Test* mp; public: Pointer(Test* p = NULL) { mp = p; } Pointer(const Pointer& obj) { mp = obj.mp; const_cast<Pointer&>(obj).mp = NULL; } Pointer& operator = (const Pointer& obj) { if (this != &obj) { delete mp; mp = obj.mp; const_cast<Pointer&>(obj).mp = NULL; } return *this; } Test* operator -> () { return mp; } Test& operator * () { return *mp; } bool isNull() { return (mp == NULL); } ~Pointer() { delete mp; } }; int main() { Pointer p1 = new Test(0); cout << p1->value() << endl; Pointer p2 = p1; cout << p1.isNull() << endl; cout << p2->value() << endl; return 0; }
輸出結(jié)果如下:
注意這兩行代碼的含義,
mp = obj.mp; const_cast<Pointer&>(obj).mp = NULL;
表明當(dāng)前對(duì)象的成員指針指向初始化對(duì)象的成員指針?biāo)鶎?duì)應(yīng)的堆空間,這就兩個(gè)智能指針對(duì)象指向了同一片堆空間,然后 const_cast<Pointer&>(obj).mp = NULL; 表明初始化對(duì)象把自己管理的堆空間交給當(dāng)前對(duì)象。這就完成了前面說(shuō)的“一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)”。
智能指針使用的軍規(guī):只能用來(lái)指向堆空間中的對(duì)象或者變量
四、小結(jié)
- 指針特征操作符( -> 和 * )可以被重載
- 重載指針特征符能夠使用對(duì)象代替指針
- 智能指針只能用于指向堆空間中的內(nèi)存
- 智能指針的意義在于最大程度的避免內(nèi)存問(wèn)題
到此這篇關(guān)于C++超詳細(xì)講解智能指針的文章就介紹到這了,更多相關(guān)C++智能指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法
今天在編寫(xiě)VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯(cuò)誤碼:126,這里就為大家分享一下具體的解決方法2021-03-03C++數(shù)據(jù)結(jié)構(gòu)模板進(jìn)階的多方面分析
今天我要給大家介紹C++中的模板更深的一些知識(shí)。有關(guān)于非類(lèi)型的模板參數(shù)和模板特化的一些知識(shí),感興趣的朋友快來(lái)看看吧2022-02-02C 語(yǔ)言restrict 關(guān)鍵字的使用淺談
C 語(yǔ)言restrict 關(guān)鍵字的使用淺談,需要的朋友可以參考一下2013-04-04linux系統(tǒng)中c++寫(xiě)日志文件功能分享
這篇文章主要介紹了linux系統(tǒng)中c++寫(xiě)日志文件功能,簡(jiǎn)化了glog,只保留了寫(xiě)日志文件的功能,只是改寫(xiě)了linux版本,需要的朋友可以參考下2014-03-03Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++關(guān)于/2和>>1的區(qū)別說(shuō)明
這篇文章主要介紹了C++關(guān)于/2和>>1的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07用C++實(shí)現(xiàn)一個(gè)鏈?zhǔn)綏5膶?shí)例代碼
本篇文章是對(duì)使用C++實(shí)現(xiàn)一個(gè)鏈?zhǔn)綏5拇a進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05