关闭

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

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

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

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

  new失败时会调用new_handler处理函数,而malloc失败则直接返回NULL。

  free与delete之间的区别则只有以下两点:

  delete是C++运算符,free是C标准库函数。

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

  针对内置类型而言,因为没有对象的构造与析构,所以malloc/free除了需要强制转型之外,和new/delete所做的工作无异,用哪一个只是涉及个人喜好而已。

  1. //declaring native type  
  2. int* i1 = new int;  
  3. delete i1;  
  4.  
  5. int* i2 = (int*) malloc(sizeof(int));  
  6. free(i2);  
  7.  
  8. //declaring native type array  
  9. char* c1 = new char[10];  
  10. delete[] c1;  
  11.  
  12. char* c2 = (char*) malloc(sizeof(char)*10);  
  13. free(c2);

  既然提到了malloc/free,不能不提一下realloc。使用realloc函数可以重新设置内存块的大小,而在C++中没有类似于realloc这样的替代品。如果出现上述需求,所做的就是,释放原来的内存,再重新申请。

  既然new/delete的功能不仅赶上而且超越了malloc/free,那为什么C++标准中没有把malloc/free淘汰出局呢?这是因为C++要遵守“对C兼容”的承诺,要让一些有价值的包含malloc/free函数库的C程序在C++中得到重用。所以,在C++中,new/delete和malloc/free一直并存着。

  不过,将malloc/free和new/delete混合使用绝对不是什么好主意。Remember that, to new is C++; to malloc is C; and to mix them is sin. 如果用free来释放通过new创建的动态对象,或者用delete释放通过malloc申请的动态内存,其结果都是未定义的。换句话说,不能保证它会出现什么问题。如果程序在关键时刻就因为这个在重要客户面前出现问题,那么懊悔恐怕已经来不及了。

  请记住:

  (1)不要企图用malloc/free 来完成动态对象的内存管理,应该用new/delete。

  (2)请记住:new是C++的,而malloc是c的。如果混淆了它们,那将是件蠢事。所以new/delete必须配对使用,malloc/free也一样。

  建议22:灵活地使用不同风格的注释

  注释,可以说是计算机程序中不可或缺的一个部分,它的存在让我们阅读程序代码、理解作者意图变得相对容易(当然,这里说的是具有良好注释的代码)。在C/C++语言中,存在着两种不同的注释语法:

  旧有的C风格的注释: /* describe your purposes */

  新式的C++风格的注释: // describe your purposes

  既然两种注释语法都有效,选择哪一种呢?C风格的还是C++风格的呢?

  很多的C++书籍推荐我们使用新式的C++风格注释语法,比如受C++程序员顶礼膜拜的经典书籍《Effective C++》在条款4中的建议就是如此。为此,Scott Meyers还给出了一定的理由—由“内嵌注释结束符”引发的“惨案”:

  1. /* C风格的注释*/  
  2. if(a>b)  
  3. {  
  4.  /*    int temp =a;   /* swap a and b */  
  5.        a = b;  
  6.        b = temp;  
  7.  */  
  8. }  
  9.  
  10. // C++风格的注释  
  11. if(a>b)  
  12. {  
  13.          //int temp =a;   // swap a and b  
  14.          //a = b;  
  15.          //b = temp;  
  16. }

  当程序员因为某些特殊原因而采用C风格的注释语法将上述代码进行注释时,由于原代码中存在原有的内嵌注释,导致注释过早地找到结束匹配符,使代码注释失效,出现编译错误。而C++风格的注释则不会出现类似的麻烦。

42/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号