您的位置:首页 > 其它

利用模版类实现指针内存的分配管理

2007-07-22 19:20 239 查看
内存分配与回收,一直都是令C/C++程序员们头痛的事情,不使用指针会降低程序的灵活性,同时也等于放弃了C/C++语言最大的优势,而使用指针就必须保证在任何情况下都不能出错,否则后果的严重性相信每个程序员都深有体会无需多讲。因此,在指针的使用上面,所有的程序员都战战兢兢,如履薄冰,同时相信每个人也都在不停的思考,并且总结出一套适合自己的方法去解决这个问题。本文使用模版类建立了一个对所有类型指针都通用的内存管理模版,目的是实现如下最基本的功能:

1. 对任何指针变量均通用

2. 可以安全的分配所需的内存

3. 无需程序员操作,实现资源的自动释放

类声明如下:
template<typename T>
class CMemAssign
{

public:
CMemAssign();
~CMemAssign(); //销毁内存
public:
//内存分派的长度 为了兼容类变量 分派和回收采用new,delete
//函数中设置单例标志,保证一个类实例只管理唯一类型指针的内存
T* CreateInstance(const long);
long GetLength(); //返回已分配内存长度
private:
T *pt_Var; //模版变量
long nLength; //内存长度
bool b_Single; //内存分配标志
};

template<typename T>
CMemAssign<T>::CMemAssign()
{
b_Single=false; //初始化单例标志
pt_Var=(T*)NULL;
}
template<typename T>
CMemAssign<T>::~CMemAssign()
{
if (pt_Var!=NULL)
{
delete [] pt_Var;
}
}
template<typename T>
T*CMemAssign<T>::CreateInstance(const long nLength) //创建实例分配内存
{
CPException *pExcep=new CPException("内存分配错误!",ERR_ALLOC_MEMORY);
if (b_Single==false){
//第一次创建
b_Single=true;
if(pt_Var!=NULL){
delete [] pt_Var;
pt_Var=NULL;
}
pt_Var=new T[nLength];
ASSERT(pt_Var!=NULL); //分配异常

if (pt_Var==NULL)
{

throw (pExcep);

}
int nDebug;
nDebug=0;
}
return pt_Var; //返回
}
template<typename T>
long CMemAssign<T>::GetLength()
{
return nLength;
}

该类通过模版可以兼容所有变量类型,为了兼容类类型保证构造函数和析构函数的能够被调用,在内存的创建和销毁时采用new和delete运算符。变量pt_Var实际上就是在类外使用的指针,它通过CreateInstance产生,并且只能被分配一次,该变量随着实例的生命周期的结束而销毁,无需程序员作任何操作。

程序示例如下:

void Test(){
CMemAssign<int> m_Assign;
int *pn_Test=m_Assign.CreateInstance(10); //创建10个int指针变量
}

当函数Test运行结束,m_Assign的生命周期结束,由实例管理的内存自动销毁。

但由于pt_Var指针被返回到了类外部,因此可以在外部被销毁,这一点为该模版安全性上留下了隐患,有待进一步改进
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: