這篇文章主要介紹“c++智能指針怎么用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“c++智能指針怎么用”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)長期為上千客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為工布江達企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站建設,工布江達網(wǎng)站改版等技術服務。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。我們在程序開發(fā)中,難免會遇到內(nèi)存泄漏。那么什么是內(nèi)存泄漏呢?就是動態(tài)申請堆空間,用完后不歸還。在 C++ 語言中沒有垃圾回收機制,在后續(xù)的語言如 Java、C# 等高級語言中就存在垃圾回收機制,指針無法控制所指堆空間的生命周期。
下來我們來看個示例代碼
#include#include 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; } }; int main() { for(int i=0; i<5; i++) { Test* p = new Test(i); cout << p->value() << endl; } return 0; }
我們明顯看到在 main 函數(shù)中只 new 對象了,而沒有 delete 對象。我們看看運行結果
我們看到只是進行了構造函數(shù),并沒有析構函數(shù)的打印。也就是說,有內(nèi)存泄漏,但是有人會說我們的程序還是運行結束了,啥事都沒有。這是因為這個程序很短,如果程序在長時間運行后,便會產(chǎn)生問題,而且這類問題是最難調試的。
那么我們就會思考了:我們到底需要的是一個什么樣的指針的?需要一個特殊的指針,在指針生命周期結束時能主動釋放堆空間。一片堆空間最多只能由一個指針標識,必須杜絕指針運算和指針比較。那么解決方案便是重載指針特征操作符(-> 和 *),只能通過類的成員函數(shù)重載,并且重載函數(shù)不能使用參數(shù)它只能定義一個重載函數(shù)。我們稱之為智能指針,下來我們來看看智能指針到底是什么樣的
#include#include 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 (obj).mp = NULL; } Pointer& operator = (const Pointer& obj) { if( this != &obj ) { delete mp; mp = obj.mp; const_cast (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(5); cout << p1->value() << endl; Pointer p2 = p1; cout << p1.isNull() << endl; cout << p2->value() << endl; return 0; }
我們在程序中定義了一個 Pointer 類,進行了一系列的操作符重載。打印 p1 的值就肯定為 5,接著將 p1 賦值給 p2,那么此時 p1 就應該為空了,因為一片空間只能有一個標識符。所以在第 78 行打印出的肯定是 1 了,最后打印的 p2 的值也就為 5 了。我們看看編譯結果
關于“c++智能指針怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。