编写高质量代码:改善C++程序的150个建议(连载11)

发表于:2012-4-17 09:25

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李健    来源:51Testing软件测试网采编

  建议21:尽量用new/delete代替malloc/free

  在C语言中,我们已经熟悉利用malloc/free来管理动态内存,而在C++中,我们又有了新的工具:new/delete。你不禁会产生疑问—有了malloc/free为什么还要new/delete 呢?使用malloc/free和使用new/delete又有什么区别呢?首先来分析一下下面的代码片段:

  1. class Object  
  2. {  
  3. public:  
  4.      Object()  
  5.      {  
  6.           cout << "Hello, I was born." << endl;  
  7.      }  
  8.      ~Object()  
  9.      {  
  10.       cout << "Bye, I am died." << endl;  
  11. }  
  12.  void Hello()  
  13.  {  
  14.    cout  <<  "I am Object."<<endl;  
  15.  }  
  16. };  
  17. int  main()  
  18. {  
  19.    cout  <<  " Using Malloc & Free... "<<endl;  
  20.    Object* pObjectA = (Object*)malloc(sizeof(Object));  
  21.    pObjectA->Hello();  
  22.    free pObjectA;  
  23.    cout  <<  " Using New & Delete... "<<endl;  
  24.    Object* pObjectB = new Object;  
  25.    pObjectB->Hello();  
  26.    delete pObjectB;  
  27.    return  0;  
  28. }

  代码运行的结果为:

  1. Using Malloc & Free...  
  2. I am Object.  
  3. Using New & Delete...  
  4. Hello, I was born.  
  5. I am Object.  
  6. Bye, I am died.

  通过结果我们可以得知:new/delete在管理内存的同时调用了构造和析构函数;而malloc/free仅仅实现了内存分配与释放。接下来,我们进行详细讨论。

  malloc/free是C/C++语言的标准库函数,而new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

  由于malloc/free是库函数,所以需要对应的头文件库函数支持。对于非内置数据类型的对象,用malloc/free无法满足创建动态对象的要求。这是因为对象在创建的同时要自动执行构造函数,对象在消亡之前则要自动执行析构函数。由于malloc/free不是运算符,不受编译器的控制管辖,所以不能够把执行构造函数和析构函数的任务强加于malloc/free上。而new/delete就不同了,它们是保留字,是操作符,它们和“+”、“-”、“*”、“/”有着一样的地位。new不仅能完成动态内存分配,还能完成初始化工作,稳妥地构造对象;delete不仅能完成内存的释放,还能进行对象的清理。举个形象的例子:通过new建造出来的是一栋房子,可以直接居住;而通过malloc申请到的仅仅是一块地皮,要想成为房子,还需要做出另外的努力。

  malloc的语法是:

指针名=(数据类型*)malloc(长度); //(数据类型*)表示指针

  new的语法是:

  1. 指针名 = new 类型(参数); // 单个对象  
  2. 指针名 = new 类型[个数]; // 对象数组

  malloc函数返回的是void *类型,如果写成:ClassA* p = malloc (sizeof(ClassA));,程序则无法通过编译,会抛出这样的错误信息:“不能将 void* 赋值给 ClassA * 类型变量”。所以必须通过 (ClassA *) 来进行强制转型。相较而言,new则不存在强制转型的问题,而且书写更为简单。总结起来,malloc与new之间的区别主要有以下几点:

  new是C++运算符,而malloc则是C标准库函数。

  通过new创建的东西是具有类型的,而malloc函数返回的则是void*,需要进行强制转型。

  new可以自动调用对象的构造函数,而malloc不会。

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号