new失败时会调用new_handler处理函数,而malloc失败则直接返回NULL。
free与delete之间的区别则只有以下两点:
delete是C++运算符,free是C标准库函数。
delete可以自动调用对象的析构函数,而malloc不会。
针对内置类型而言,因为没有对象的构造与析构,所以malloc/free除了需要强制转型之外,和new/delete所做的工作无异,用哪一个只是涉及个人喜好而已。
|
既然提到了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还给出了一定的理由—由“内嵌注释结束符”引发的“惨案”:
|
当程序员因为某些特殊原因而采用C风格的注释语法将上述代码进行注释时,由于原代码中存在原有的内嵌注释,导致注释过早地找到结束匹配符,使代码注释失效,出现编译错误。而C++风格的注释则不会出现类似的麻烦。