当前位置:   article > 正文

C++的new 和 delete 操作符重载。_c++重载 delete

c++重载 delete

测试代码:

  1. // test.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <cstdlib>
  5. #include <new>
  6. #include <iostream>
  7. using namespace std;
  8. class test{
  9. public:
  10. int a;
  11. double x;
  12. test(int i,double m):a(i),x(m)
  13. {
  14. printf("creating test\n");
  15. };
  16. void* operator new(size_t sz)
  17. {
  18. cout<<"new: size_t "<<sz<<endl<<"sizeof(test): "<<sizeof(test)<<endl;
  19. return malloc(sizeof(test));
  20. }
  21. void operator delete(void* p)
  22. {
  23. cout<<"free:"<<endl;
  24. free(p);
  25. p=0;
  26. }
  27. };
  28. int _tmain(int argc, _TCHAR* argv[])
  29. {
  30. test* te=new test(1,12);
  31. delete te;
  32. test* te1=new test(2,10);
  33. delete te1;
  34. return 0;
  35. }

test* te=new test(1,12);调用了两个函数,首先调用test的new函数,然后调用了test的构造函数。

new函数虽然没有显示的表明是static的,但是它确实是static函数,可以直接调用。

在delete te;时,首先析构函数被调用,然后是test中的delete函数被调用。

new[] 和 delete[] 同样的道理。先分配一整块内存,对每一个进行构造。再对每一个进行析构,然后free整块内存。

在进行malloc的时候,实际分配的内存要比真正需要的内存大,用于存放块的一些信息。

free的时候通过这些信息,确定需要free的空间的大小。

  1. // test.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <cstdlib>
  5. #include <new>
  6. #include <iostream>
  7. using namespace std;
  8. class test{
  9. public:
  10. int a;
  11. double x;
  12. test()
  13. {
  14. a=0;
  15. x=0.0;
  16. printf("test();\n");
  17. }
  18. test(int i,double m):a(i),x(m)
  19. {
  20. printf("test(int i,double m);\n");
  21. };
  22. ~test()
  23. {
  24. cout<<"~test()"<<endl;
  25. }
  26. void* operator new(size_t sz)
  27. {
  28. cout<<"new"<<sz<<endl<<"sizeof(test): "<<sizeof(test)<<endl;
  29. void * p=malloc(sz);
  30. return p;
  31. }
  32. void* operator new[](size_t sz)
  33. {
  34. cout<<"new[]"<<sz<<endl<<"sizeof(test): "<<sizeof(test)<<endl;
  35. void * p=malloc(sz);
  36. return p;
  37. }
  38. void operator delete(void* p)
  39. {
  40. cout<<"delete"<<endl;
  41. free(p);
  42. p=0;
  43. }
  44. void operator delete[](void* p)
  45. {
  46. cout<<"delete[]"<<endl;
  47. free(p);
  48. p=0;
  49. }
  50. };
  51. int _tmain(int argc, _TCHAR* argv[])
  52. {
  53. test* te=new test[12];
  54. delete []te;
  55. test* te1=new test[10];
  56. delete []te1;
  57. return 0;
  58. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/876190
推荐阅读
相关标签
  

闽ICP备14008679号