C 智慧型指標實現

2021-06-16 07:12:18 字數 2076 閱讀 1143

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...