不迎不送,来去自便,无茶无酒,谈笑随缘

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

    内存分配与回收,一直都是令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指针被返回到了类外部,因此可以在外部被销毁,这一点为该模版安全性上留下了隐患,有待进一步改进

posted on 2007-07-22 19:20  wude  阅读(144)  评论(0编辑  收藏  举报