建议21:尽量用new/delete代替malloc/free(2)
new失败时会调用new_handler处理函数,而malloc失败则直接返回NULL。
free与delete之间的区别则只有以下两点:
delete是C++(www.cppentry.com)运算符,free是C标准库函数。
delete可以自动调用对象的析构函数,而malloc不会。
针对内置类型而言,因为没有对象的构造与析构,所以malloc/free除了需要强制转型之外,和new/delete所做的工作无异,用哪一个只是涉及个人喜好而已。
- //declaring native type
- int* i1 = new int;
- delete i1;
-
- int* i2 = (int*) malloc(sizeof(int));
- free(i2);
-
- //declaring native type array
- char* c1 = new char[10];
- delete[] c1;
-
- char* c2 = (char*) malloc(sizeof(char)*10);
- free(c2);
既然提到了malloc/free,不能不提一下realloc。使用realloc函数可以重新设置内存块的大小,而在C++(www.cppentry.com)中没有类似于realloc这样的替代品。如果出现上述需求,所做的就是,释放原来的内存,再重新申请。
既然new/delete的功能不仅赶上而且超越了malloc/free,那为什么C++(www.cppentry.com)标准中没有把malloc/free淘汰出局呢?这是因为C++(www.cppentry.com)要遵守“对C兼容”的承诺,要让一些有价值的包含malloc/free函数库的C程序在C++(www.cppentry.com)中得到重用。所以,在C++(www.cppentry.com)中,new/delete和malloc/free一直并存着。
不过,将malloc/free和new/delete混合使用绝对不是什么好主意。Remember that, to new is C++(www.cppentry.com); to malloc is C; and to mix them is sin. 如果用free来释放通过new创建的动态对象,或者用delete释放通过malloc申请的动态内存,其结果都是未定义的。换句话说,不能保证它会出现什么问题。如果程序在关键时刻就因为这个在重要客户面前出现问题,那么懊悔恐怕已经来不及了。
请记住:
(1) 不要企图用malloc/free 来完成动态对象的内存管理,应该用new/delete。
(2)请记住:new是C++(www.cppentry.com)的,而malloc是c的。如果混淆了它们,那将是件蠢事。所以new/delete必须配对使用,malloc/free也一样。