C++ 内存分配小例


在更安全使用malloc()、calloc()、realloc()等内存分配函数的议题中,有许多事可以做,下面的函数模板处理了一函数getmem(),这个函数既可以分配新的内存空间,或者调整已分配内存空间的大小,它把新空间全部置0, 并检查操作是否成功。这样,只需要告诉它需要多少空间就行了,这样做可以减少程序出错的可能性。函数代码如下:
  1. template<class T>  
  2. void getmem(T* &oldmem, int elems)  
  3. {  
  4.     typedef int cntr;  
  5.     const int csz = sizeof(cntr);  
  6.     const int tsz = sizeof(T);  
  7.   
  8.     if (0 == elems)  
  9.     {  
  10.         free(&(((cntr *)oldmem)[-1]));  
  11.         return;  
  12.     }  
  13.   
  14.     T *p = oldmem;  
  15.     cntr oldcount = 0;  
  16.     if (p)  
  17.     {  
  18.         cntr *tmp = reinterpret_cast<cntr *>(p);  
  19.         p = reinterpret_cast<T *>(--tmp);  
  20.         oldcount = *(cntr *)p;  
  21.     }  
  22.   
  23.     T *m = (T *)realloc(p, elems * tsz + csz);  
  24.     if (0 == m)  
  25.     {  
  26.         cout << "ERROR!" << endl;  
  27.         exit(1);  
  28.     }  
  29.   
  30.     *((cntr *)m) = elems;  
  31.     const cntr increment = elems - oldcount;  
  32.     if (increment > 0)  
  33.     {  
  34.         long startadr = (long)&(m[oldcount]);  
  35.         startadr += csz;  
  36.         memset((void *)startadr, 0, increment * tsz);  
  37.     }  
  38.   
  39.     oldmem = (T *)&(((cntr *)m)[1]);  
  40. }  
  41.   
  42. template<class T>  
  43. inline void freemem(T *m) { getmem(m, 0); }  
  • 1
  • 2
  • 下一页

相关内容