自己动手实现一个C++智能指针

C++没有提供垃圾回收机制,程序员需要小心翼翼的处理动态内存的分配使用和释放,稍有不慎就会引起悬垂指针内存泄露等问题,尤其在大型程序中出现这种问题往往让人苦不堪言。当然,垃圾回收机制并不是完全没有副作用,引入垃圾回收机制可能会增加程序时间和空间上的开销,同时C++作为一种设计之初就兼容C的语言,在底层开发中被大量使用,实现垃圾回收机制带来的复杂性可能会让C++失去在对性能追求极高的底层,游戏开发等领域中的用武之地。

C++标准库和boost库提供了几种智能指针来帮助我们来管理动态内存的释放,智能指针包含了设计模式中代理模式的思想,智能指针通过运算符重载等方式实现原指针同样的操作接口,使得我们几乎可以像操作正常指针一样操作智能指针,同时智能指针作为一个栈上的对象,在其作用域结束时其析构函数会被自动调用,智能指针在其析构函数里释放原始指针所指向的内存,从而杜绝了内存泄露的问题。

贴出我实现的一份智能指针代码:

// asdfa.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
//引用计数类
class counter
{
public:
	counter(){}
	counter(int parCount) :count(parCount){}
	void increaseCount() { count++; }
	void decreasCount(){ count--; }
	int  getCount(){ return count; }
private:
	int count;
};

//智能指针
template<class T>
class SmartPointer
{
public:
	explicit  SmartPointer(T* pT) :mPtr(pT), pCounter(new counter(1)){}
	explicit  SmartPointer():mPtr(NULL),pCounter(NULL){}
	~SmartPointer()		//析构函数,在引用计数为0时,释放原指针内存
	{
		if (pCounter != NULL)
		{
			pCounter->decreasCount();
			if (pCounter->getCount() == 0)
			{
				delete pCounter;
				delete mPtr;
				pCounter = NULL;	//将pCounter赋值为NULL,防止悬垂指针
				mPtr = NULL;
				cout << "delete original pointer" << endl;
			}
		}
	}

	SmartPointer(SmartPointer<T> &rh)	//拷贝构造函数,引用加1
	{
		this->mPtr=rh.mPtr;
		this->pCounter = rh.pCounter;
		this->pCounter->increaseCount();
	}

	SmartPointer<T>& operator=(SmartPointer<T> &rh) //赋值操作符,引用加1
	{
		if (this->mPtr == rh.mPtr)
			return *this;
		this->mPtr = rh.mPtr;
		this->pCounter = rh.pCounter;
		this->pCounter->increaseCount();
		return *this;
	}
	T& operator*()			//重载*操作符
	{
		return *mPtr;
	}
	
	T* operator->()			//重载->操作符
	{
		return p;
	}
	T* get()
	{
		return mPtr;
	}
private:
	T* mPtr;
	counter* pCounter;
};
int _tmain(int argc, _TCHAR* argv[])
{
	SmartPointer<int> sp1(new int(10));
	SmartPointer<int> sp2 = sp1;
	SmartPointer<int> sp3;
	sp3 = sp2;
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值