歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++ 內存分配小例

C++ 內存分配小例

日期:2017/3/1 10:25:06   编辑:Linux編程
在更安全使用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. if (0 == elems)
  8. {
  9. free(&(((cntr *)oldmem)[-1]));
  10. return;
  11. }
  12. T *p = oldmem;
  13. cntr oldcount = 0;
  14. if (p)
  15. {
  16. cntr *tmp = reinterpret_cast<cntr *>(p);
  17. p = reinterpret_cast<T *>(--tmp);
  18. oldcount = *(cntr *)p;
  19. }
  20. T *m = (T *)realloc(p, elems * tsz + csz);
  21. if (0 == m)
  22. {
  23. cout << "ERROR!" << endl;
  24. exit(1);
  25. }
  26. *((cntr *)m) = elems;
  27. const cntr increment = elems - oldcount;
  28. if (increment > 0)
  29. {
  30. long startadr = (long)&(m[oldcount]);
  31. startadr += csz;
  32. memset((void *)startadr, 0, increment * tsz);
  33. }
  34. oldmem = (T *)&(((cntr *)m)[1]);
  35. }
  36. template<class T>
  37. inline void freemem(T *m) { getmem(m, 0); }
Copyright © Linux教程網 All Rights Reserved