【数据结构学习之完全从零实现所有数据结构的代码编写之二】智能指针
今天我們依然暫時不講解數(shù)據(jù)結(jié)構(gòu)里面的內(nèi)容,我們來復(fù)習(xí)一下昨天學(xué)的模板技術(shù)用于數(shù)據(jù)結(jié)構(gòu)編程的思想,給出一個模板技術(shù)的實例:智能指針的應(yīng)用。喜歡看我分享的加我q:1126137994 加我共同學(xué)習(xí)交流各種技術(shù)。
為什么會引入智能指針呢?原因是在軟件開發(fā)中最可恨最常見的BUG:內(nèi)存泄漏!是什么導(dǎo)致內(nèi)存泄漏?
-動態(tài)申請堆空間,用完后不歸還
-C++語言中,沒有垃圾回收機(jī)制
-指針無法控制堆空間的生命周期
那么引入智能指針后,智能指針能做什么呢?
-指針生命周期結(jié)束時,主動釋放堆空間
-一片堆空間,最多只能由一個指針標(biāo)識
-杜絕指針運算和指針比較
智能指針的設(shè)計方案:
-通過類模板描述指針的行為
*能夠定義不同類型的指針對象
-重載指針特征操作符(->和*)
*利用對象模擬原生指針的行為
重要說明:智能指針只能用來指向堆空間中的單個對象或者變量
下面給出代碼示例,我主要做的是在QT編譯器中建立了一個C++工程庫,以后所有的數(shù)據(jù)結(jié)構(gòu)的代碼,都在這個庫里實現(xiàn):
頭文件(SmartPointer.h):
main.cpp函數(shù):
#include <iostream> #include "SmartPointer.h"using namespace std; using namespace DTLib; //使用我們定義的命名空間class Test { public:Test() {cout << "Test()" << endl; //測試試驗,僅打印語句}~Test(){cout << "~Test()" << endl; //測試試驗,僅打印語句} };int main() {SmartPointer<Test> sp = new Test(); //聲明一個智能指針sp指向Test對象所對應(yīng)的的堆空間//SmartPointer<Test> nsp; //又定義了一個智能指針//nsp = sp; //該智能指針指向sp指向Test對象所對應(yīng)的的堆空間//cout << sp.isNull() << endl;//cout << nsp.isNull() << endl;return 0; }運行上面程序,顯示結(jié)果為:
可以看出,我們并沒有主動去歸還申請的堆空間,而是程序自動的調(diào)用了析構(gòu)函數(shù)銷毀了Test對象所對應(yīng)的申請的堆空間。
那么我們將注釋掉的那幾行加上,編譯運行:
可以看出,sp這個指針已經(jīng)為空,nsp指針不為空,指向的是Test對象所對應(yīng)的的堆空間,最后又將這個Test對象析構(gòu),銷毀堆空間。
當(dāng)然如果我們在main函數(shù)里加上一個nsp++的運算,編譯就會報錯,因為我們已經(jīng)禁止了智能指針的比較與運算。
那么到此為此,我們已經(jīng)實現(xiàn)了智能指針的實例。
總結(jié):
1.指針特征操作符(->和*)可以被重載
2.重載指針特征符能夠使用對象代替指針
3.智能指針只能用于指向堆空間中的指針
4.智能指針的意義在于最大程度的避免內(nèi)存問題
想一起探討以及獲得各種學(xué)習(xí)資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關(guān)于嵌入式,操作系統(tǒng),C++語言,C語言,數(shù)據(jù)結(jié)構(gòu)等技術(shù)問題。
總結(jié)
以上是生活随笔為你收集整理的【数据结构学习之完全从零实现所有数据结构的代码编写之二】智能指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: moviepy音视频开发:音频拼接函数c
- 下一篇: php gmssl,GmSSL是什么