您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++智能指針實(shí)例代碼分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++智能指針實(shí)例代碼分析”吧!
動(dòng)態(tài)申請(qǐng)堆空間,用完后不歸還
C++ 語言中沒有垃圾回收的機(jī)制
指針無法控制所指堆空間的生命周期
下面看一段內(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)算和指針比較
解決方案
重載指針特征操作符( -> 和 * )
只能通過類的成員函數(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ì)象。這就完成了前面說的“一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)”。
智能指針使用的軍規(guī):只能用來指向堆空間中的對(duì)象或者變量
感謝各位的閱讀,以上就是“C++智能指針實(shí)例代碼分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C++智能指針實(shí)例代碼分析這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。