【让你的C++程序更加高效】条款03:尽量使用new/delete而不是malloc/free

首先说明一下
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++》,条款编号无先后关系
博文原始地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值