您的位置:首页 > 编程语言 > C语言/C++

C++引用计数实现垃圾回收机制

2012-08-27 12:58 615 查看
原理:用一个数去统计指向堆中的无名对象指针的个数,由最后一个指针去释放其空间。为了保持同步,应该使这个数也只有一份。

简单实现如下

//SmartPtr.h
#pragma once
#include <iostream>
using namespace std;

template <class T>
class CSmartPtr
{
public:
CSmartPtr():m_ptr(NULL),m_count(NULL)
{
}

CSmartPtr( T* ptr):m_count(new int(1)),m_ptr(ptr)
{

}

~CSmartPtr()
{
if(m_count!= NULL)
{
(*m_count)--;

if( *m_count<=0 && m_ptr!= NULL)
{
delete m_ptr;
delete m_count;
}
}
}

CSmartPtr(const CSmartPtr<T>& CPtr)
{
m_ptr=CPtr.m_ptr;
if(CPtr.m_ptr != NULL)
{
(*CPtr.m_count)++;
}
m_count=CPtr.m_count;
}

CSmartPtr<T>& operator =(const CSmartPtr<T>& CPtr)
{
if(this != &CPtr)//不是自己给自己赋值
{
(*m_count)--;
if((*m_count<=0) && (m_ptr!= NULL) )
{
delete m_ptr;
}

m_ptr=CPtr.m_ptr;
if(CPtr.m_ptr != NULL)
{
(*CPtr.m_count)++;
}
m_count=CPtr.m_count;
}
return *this;
}

bool operator !=(const CSmartPtr<T>& CPtr)
{
return (m_ptr != CPtr.m_ptr);
}

bool operator ==(const CSmartPtr<T>& CPtr)
{
return (m_ptr == CPtr.m_ptr);
}

T* operator ->()
{
return m_ptr;
}

T* GetPtr()
{
return m_ptr;
}

int GetCount()
{
return (*m_count);
}

private:
T *m_ptr;
int *m_count;
};

//test.cpp
#include "SmartPtr.h"
#include <string>

class CTest
{
public:
CTest(string name):m_name(name)
{
cout<<m_name<<" Construction.\n";
}
~CTest()
{
cout<<m_name<<" Destructor.\n";
}
private:
string m_name;
};

void main()
{
CSmartPtr<CTest> ptr1= new CTest("test1");
CSmartPtr<CTest> ptr2(NULL);
CSmartPtr<CTest> ptr3;

ptr2=ptr1;
}







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: