歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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); }  
Copyright © Linux教程網 All Rights Reserved