首先说明一下
new/delete是C++的operator(操作符,比如+,-,*,/,==,!等都是操作符)
malloc/free是function(函数),在堆(heap)上分配内存/回收内存
假设现在要为一个(或一组)对象分配空间,不再使用时进行内存回收,两个方面依次讨论
开辟存储空间
旧式malloc函数只是分配所请求大小的存储空间并返回首地址,但不做其他事情
新式new操作符不仅分配存储空间而且注意到目标对象的constructor(构造函数)并按照合适方式调用
这就意味着,使用new操作符不仅为这个(这组)对象开辟开辟了空间,而且这个(这组)对象可以立即使用
但mallo函数只管分配空间,而这个(这组)变量没有被初始化,也许不能立即使用(参见“使用前请初始化”,“使用未初始化的变量/对象会导致未定义/不可预知的行为”)
注意这里暂且不管“内存分配失败”等异常
回收存储空间
对应的,free函数只是简单的执行内存回收工作
操作符delete则首先检查destructor(析构函数),如果可以就先进行析构,然后再回收内存
有时候使用malloc/free是没有问题的,例如我想分配一个大型的int数组用完之后再释放
但是在C++面向对象环境下还是使用新式的new/delete操作符,因为object的大量使用需要特别谨慎
以上第一层次的分析就足以说明这种转换的好处
在使用时还需要注意
1.配对使用,就是说malloc搭配free,new搭配delete,否则可能会出事
2.当new开辟的是对象数组时,请配合使用delete [] 以明确行为
举个例子
string *stringArray1 =static_cast<string*>(malloc(10 * sizeof(string)));
string *stringArray2 = new string[10];
前者string数组是未经过初始化的,某些行为“不安全”,例如stringArray1[0].c_str();
后者则是经过了初始化
释放内存请使用
free(stringArray1);
delete [] stringArray2;
其他细节稍后补充
注意:本条款以及后续许多条款在大多数情况下是effective的建议,但并不是绝对的。
本文原创,条款内容以及详解部分内容参考《(More) Effective C++》,条款编号无先后关系
博文原始地址