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