您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++智能指針實例代碼分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++智能指針實例代碼分析”吧!
動態申請堆空間,用完后不歸還
C++ 語言中沒有垃圾回收的機制
指針無法控制所指堆空間的生命周期
下面看一段內存泄漏的代碼:
#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; }
輸出結果如下:
需要一個特殊的指針
指針生命周期結束時主動釋放堆空間
一片堆空間最多只能由一個指針標識
杜絕指針運算和指針比較
解決方案
重載指針特征操作符( -> 和 * )
只能通過類的成員函數重載
重載函數不能使用參數
只能定義一個重載函數
下面看一段智能指針的使用示例:
#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; }
輸出結果如下:
注意這兩行代碼的含義,
mp = obj.mp; const_cast<Pointer&>(obj).mp = NULL;
表明當前對象的成員指針指向初始化對象的成員指針所對應的堆空間,這就兩個智能指針對象指向了同一片堆空間,然后 const_cast<Pointer&>(obj).mp = NULL; 表明初始化對象把自己管理的堆空間交給當前對象。這就完成了前面說的“一片堆空間最多只能由一個指針標識”。
智能指針使用的軍規:只能用來指向堆空間中的對象或者變量
感謝各位的閱讀,以上就是“C++智能指針實例代碼分析”的內容了,經過本文的學習后,相信大家對C++智能指針實例代碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。