来源: 本文主要参考书籍 Effective C++ 转载请标明出处(尊重原创,谢谢!)
条款三
1 尽量使用new 和 delete 而不使用malloc 和 free
Effective C++ 书籍上面也有相对应的小示例下面也主要是一个总结
原因 1:delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。
原因 2:new/delete 和malloc/free 都可动态的申请内存,仅仅使用malloc/free 不能满足动态对象的要求,原因1 也说的比较明显,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符(原因就在此),不能够把执行构造函数和析构函数的任务强加于malloc/free。而C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
2 new 和 delete 与 malloc 和 free 混在一起使用(严重不推荐)
原因 1:不可预见错误,new/delete 和malloc/free 不兼容性导致, 当然在C++中使用malloc 和 free 是不会出错的噢!
小结:如果面试你可以顺利的说出上面几点。offer 还怕么,答案是:NO
条款 5
1 对应的new 和 delete 采用相同的形式(delete与 delete []区别)
示例解析:
string stringArray = new string[100]; /* 代码初始化区域 */ delete stringArray ;
运行结果:不可预测错误(“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operatordelete来释放内存。”)
原因 1: stringArray 指向100 string个对象,99 个不会被正确销毁,调用new 首先内存被分配(operate new函数),将自行判断执行一个或多个 构造函数 ,执行delete 同样如此(operator delete来释放内存),对于delete 对象,取决于析构函数
原因 2:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。
2 typedef 可解决delete 问题
原因 1:new 创建typedef 应该使用什么形式的delete 来删除
示例解析:
typedef string AddressLine[5] //一个人的地址 5行,都是string //因为AddressLine 是个数组 使用new string * aries = new AddressLine //OK 如果你下面这样做会怎么样呢? delete aries //error delete [] aries //ok上面这样做也可避免错误发生!
原因 2:此书也说面 最好不对 数组对象使用typedef (因为C++ 标准库包含了string 和 vector 模板使用它们将会很少使用数组),我认为还是看自己习惯使用,当然也有此书的道理。