為了防止有多個(gè)指針指向的數(shù)據(jù)被多次刪除,我們還可以保存究竟有多少個(gè)指針指向該數(shù)據(jù)。只有當(dāng)沒(méi)有任何指針指向該數(shù)據(jù)的時(shí)候才可以被刪除。這種思路通常被稱之為引用計(jì)數(shù)技術(shù)。在構(gòu)造函數(shù)中,引用計(jì)數(shù)初始化為1;每當(dāng)把這個(gè)實(shí)例賦值給其他實(shí)例或者以參數(shù)傳給其他實(shí)例的構(gòu)造拷貝函數(shù)的時(shí)候,引用計(jì)數(shù)加1,因?yàn)檫@意味著又多了一個(gè)實(shí)例指向它的data;每次需要調(diào)用析構(gòu)函數(shù)或者需要把data賦值為其他數(shù)據(jù)的時(shí)候,引用計(jì)數(shù)要減1,因?yàn)檫@意味著指向它的data的指針少了一個(gè)。當(dāng)引用計(jì)數(shù)減少到0的時(shí)候,data已經(jīng)沒(méi)有任何實(shí)例指向它了,這個(gè)時(shí)候就可以安全地刪除。實(shí)現(xiàn)的代碼如下:
public:
Array(unsigned arraySize)
:data(0), size(arraySize), count(new unsigned int)
{
*count = 1;
if(size > 0)
data = new T[size];
}
Array(const Array& copy)
: size(copy.size), data(copy.data), count(copy.count)
{
++ (*count);
}
~Array()
{
Release();
}
const Array& operator = (const Array& copy)
{
if(data == copy.data)
return *this;
Release();
data = copy.data;
size = copy.size;
count = copy.count;
++(*count);
}
private:
void Release()
{
--(*count);
if(*count == 0)
{
if(data)
{
delete []data;
data = NULL;
}
delete count;
count = 0;
}
}
unsigned int *count;
相關(guān)推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |