智能指標可以解決記憶體泄露的問題,就是用對象來管理記憶體資源。由於C++機制中有對象在離開範圍的時候,解構函式會被自動調用。此時在解構函式中完成動態申請記憶體的釋放。程式員在使用智能指標後。不用擔心記憶體泄露。當然互引用的情況,還是會造成記憶體泄露,即使使用本文中所編寫的智能指標。
由於C++沒有記憶體回收機制,但是可以利用解構函式自調用的機制來實現指標的自釋放。通過類來封裝一個指標和該指標所指向記憶體的引用計數器。當大於1個以上的指標指向同一記憶體地區時,要釋放該地區的時候,先判斷該地區的引用計數是否為1,若不為1,則不釋放,只是把該地區的引用計數減1.當減小到1的時候,才真正的去delete掉動態申請的那塊地區。
在智能指標中,主要目的是解決記憶體泄露的問題。但是由於智能指標在淺拷貝(即只是把指標賦值,而不是申請一塊與來源物件的記憶體地區一樣的記憶體)的時候,存在多個指標同時指向一塊記憶體地區的情況,所以需要顯示定義智能指標類的拷貝建構函式和賦值建構函式,並在裡面處理真正的指標賦值和引用計數的變化。
原始碼如下:
#include <stdio.h>#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>template <typename T>class SharedSmartPtr{private:T* m_ptr;unsigned int m_count;public:SharedSmartPtr(T* p):m_ptr(p),m_count(1){}~SharedSmartPtr(){Destructor();}void Destructor(){if(m_count==1){ delete m_ptr;}m_count--;}T& operator*(){return *m_ptr;}T* operator->(){return m_ptr;}//拷貝建構函式SharedSmartPtr(SharedSmartPtr &SSP):m_ptr(SSP.m_ptr),m_count(SSP.m_count){m_count++;
}//賦值建構函式SharedSmartPtr& operator =(SharedSmartPtr &SPP){Destructor();m_ptr=SPP.m_ptr;m_count=SPP.m_count;m_count++;return *this;}};class Investment{public:int price;Investment(int p){price=p;}};void main(){/***********用於檢測記憶體泄露**************/int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );tmpFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag( tmpFlag ); /*************用於檢測記憶體泄露********************/SharedSmartPtr<Investment> ssp(new Investment(2)); SharedSmartPtr<Investment> ssp2(ssp);ssp2->price=5;printf("ssp->price=%d\n",ssp->price);SharedSmartPtr<Investment> ssp3=ssp2;SharedSmartPtr<Investment> sspx(new Investment(10));sspx=ssp;printf("sspx->price=%d\n",sspx->price);system("PAUSE");}