我們知道c++中最令人頭疼的當屬指標,如果您申請了物件卻沒有釋放它,時間一長就會造成系統崩潰,大量的記憶體溢位使得您的程式的健壯性出現問題
而控制代碼類就是為了能夠解決這一問題而出現的,控制代碼類有點類似於智慧型指標。
好了,廢話不多說,我們來看**
首先我們來看 sample.h檔案的**:
/** author:xizero00
* mail:[email protected]
* date:2011-08-07 20:11:24
* handle class sample 控制代碼類示例
*/#ifndef sample_h
#define sample_h
#include
#include
using
namespace std;
//基類
class item_base
};
//子類
class bulk_item: public item_base
};
//子類的子類
class sales_item: public bulk_item
//帶有乙個引數的,且該引數為基類引用的建構函式
sales_item( const item_base& );
//複製建構函式,需要注意的是,每複製一次就需要增加引用計數一次
sales_item( const sales_item &i ): p( i.p ) , use( i.use ) //也可以這樣寫
//sales_item( const sales_item &i ): p( i.clone() ) , use( new size_t( 1 ) )
//析構函式,析構的時候會判斷是否能夠釋放指標所指向的資料
~sales_item()
//賦值操作符過載
sales_item& operator= ( const sales_item& );
//訪問操作符過載
const item_base* operator-> () const
else
} //解引用操作符過載
const item_base& operator* () const
else
} //過載虛函式,用於智慧型地複製物件
/*virtual sales_item* clone() const
*/private:
//兩個指標儲存著引用計數器以及資料的指標
item_base *p;
size_t *use;
//減少引用
void decr_use()
} };
//賦值操作符過載,每次複製都會增加引用計數
sales_item& sales_item::operator= ( const sales_item &si )
#endif //sample_h
接下來我們來看sample.cc的**:
/** author:xizero00
* mail:[email protected]
* date:2011-08-07 20:11:24
*/#include "sample.h"
int main( int argc , char **argv )
下面給出編譯所需的makefile
# author:xizero00
# mail:[email protected]
# date:2011-08-08 00:51:25
install:
g++ sample.cc -g -o sample
ls -al sample*
./sample
clean:
rm -f sample
ls -al sample*
注意:**是在linux下編譯,您只需要將三個檔案放在同乙個目錄,然後在當前目錄開啟終端,輸入make,就可以檢視到結果。
如果您想清理生成的檔案 輸入make clean即可
下面是我執行的結果:
sales_item的引用計數器初始化為1
sales_item的引用計數器初始化為1
由於採用了複製建構函式,sales_item型別的物件引用計數為:2
由於採用了複製建構函式,sales_item型別的物件引用計數為:3
由於採用類賦值操作,被賦值的物件的引用計數為:1即將被賦值的物件的引用計數為:3
被賦值的物件的賦值之後的引用計數為:2
在 dec_use函式中引用計數減少了,當前計數值為:2
即將被賦值的物件賦值之後的引用計數為:2
在析構函式中:在 dec_use函式中引用計數減少了,當前計數值為:1
在析構函式中:在 dec_use函式中引用計數減少了,當前計數值為:1
在析構函式中:在 dec_use函式中引用計數減少了,當前計數值為:0
在 dec_use函式中計數器減為0,釋放物件
在析構函式中:在 dec_use函式中引用計數減少了,當前計數值為:0
在 dec_use函式中計數器減為0,釋放物件
結論:我們可以看到,控制代碼類能夠很方便並且能夠很安全地釋放記憶體,不會導致記憶體的洩露。
初次邂逅控制代碼類 C primer
控制代碼類儲存和管理基類指標。指標所指物件的型別可以變化,既能指向基類型別物件又可以指向派生類型別物件。使用者通過控制代碼類訪問 繼承層次的操作 virtual 函式 設計考慮因素 1 對任何儲存指標的類一樣,必須確定對複製控制的具體操作。包裝了繼承層次的控制代碼應該表現得像乙個智慧型指標或者像乙個...
讀C Primer 之智慧型指標
author xizero00 mail xizero00 163.com date 2011 08 07 20 19 11 smart pointer sample include using namespace std 智慧型指標類 class smartptr 析構函式 smartptr 使用...
理解控制代碼類
在 類的幫助下,我們已經可以實現在乙個容器裡儲存乙個類層次裡所有型別的物件,但是 有乙個很明顯的缺點,就是需要複製物件,當乙個物件非常大或者是一種不能輕易複製的資源的時候,這個實現遇到了很大的困難,於是我們有了控制代碼 handle 類這個技術。我們有這麼乙個類 class point point ...