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

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

简单实现如下

//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;
}







  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值