1、問題的提出
先看下面的例子:
class ctext
~ctext()
private:
int *m_ptr; };
int funtext()
在函式funtext()中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式;退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete ptr,因而第二次呼叫時將會出現錯誤。
以上例子說明,當類中有指標成員時,必須明確何時才是操作delete指標的時機。智慧型指標能夠解決上述問題。
2、智慧型指標的原理
前面的例子執行時出現的錯誤系第二次析構時「無ptr可delete」所致。為解決這個問題,我們可以這樣設想:定義乙個計數變數int counter = 0,每次呼叫建構函式時,counter加1,呼叫析構函式時,counter減1。當counter等於0時,delete ptr。這樣在函式退出時就不會有錯誤了。這種實現技術稱之為引用計數。
智慧型指標需要運用引用計數技術。當然,這裡就不再是定義計數變數那麼簡單了。依據c++的封裝性,我們定義乙個計數器類ccounter,負責對計數變數的操作。
class ccounter ;
應用智慧型指標,其實就是建立乙個智慧型指標類csmartpointer。csmartpointer將ccouter與csmartpointer物件相關聯,ccouter負責記錄有多少個csmartpointer物件共用同一指標。
template
class csmartpointer ;
類csmartpointer負責如下功能:
◆ 建立物件時,初始化類指標成員並呼叫addcounter();
◆ 物件作為另一物件的副本而建立時,拷貝指標並呼叫addcounter();
◆ 對物件進行賦值時,賦值運算子左邊物件呼叫關聯的deccounter(),拷貝指標後,賦值運算子右邊物件呼叫關聯的addcounter()。
◆ 呼叫析構函式,析構函式呼叫deccounter()。
3、**實現
類ccounter定義與實現:
#ifndef _ccounter_h_
#define _ccounter_h_
class ccounter //要使用智慧型指標的類須繼承該類 ;
#endif
#include"ccounter.h"
ccounter::ccounter():m_uncounter(0)
ccounter::~ccounter()
void ccounter::addcounter()
void ccounter::deccounter()
}模板類csmartpointer的定義與實現:
#include"ccounter.h"
template
class csmartpointer;
template
csmartpointer::csmartpointer(t *pointer = null):m_pointer(pointer)}
template
csmartpointer::csmartpointer(const csmartpointer&refsp)}
template
csmartpointer&csmartpointer::operator =(const csmartpointer&refsp)
m_pointer = refsp.m_pointer;
if (null != m_pointer)}}
template
csmartpointer::~csmartpointer() }
則可在主函式main()中,編寫如下**:
// main.cpp
#include" csmartpointer.h"
class ctext:public ccounter
~ctext()
private:
int *m_ptr; };
int main()
智慧型指標實現C
include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...
C 實現智慧型指標
c 11增加了智慧型指標 shared ptr unique ptr weak ptr 為了加深理解,自己實現智慧型指標 我們都知道shared ptr的核心思想通過引用計數來管理記憶體 先實現單個指標的自我管理,看下面 template class ref ref t p m ptr p ref ...
C 實現智慧型指標
include include using namespace std 智慧型指標自我實現 template typename t class myautoptr myautoptr const myautoptr ptr myautoptr operator const myautoptr ptr...