new、delete、malloc、free关系
2015-11-11 22:52
405 查看
new、delete、malloc、free关系
delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。delete与 delete []区别
delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”delete与new配套,delete []与new []配套MemTest *mTest1=new MemTest[10];
MemTest *mTest2=new MemTest;
Int *pInt1=new int [10];
Int *pInt2=new int;
delete[]pInt1; //-1-
delete[]pInt2; //-2-
delete[]mTest1;//-3-
delete[]mTest2;//-4-
在-4-处报错。
这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针。简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。
相关文章推荐
- Scala 读取网页数据测试及备忘
- [Django架构流程分析]Django框架架构总览
- 单例模式的七种写法
- Android Resource Types之Animation简介
- jquery事件之事件处理函数
- 用yum来安装或卸载CentOS图形界面包
- 常用的jsDoc
- 对数据更新的认识
- linux系统在往文件写入之后,读出来后面却又乱码原因
- Windows程序调试----第三部分 调试技术----第9章 内存调试
- 支付宝无法异步通知及异步通知常见问题注意事项
- Linux内核模块编程-proc文件系统
- Microsoft Azure
- LeetCode OJ:Nim Game(Nim游戏)
- 关于Fragment与Fragment、Activity通信的四种方式
- cacti安装配置文档
- 计算机安全
- 关于Fragment与Fragment、Activity通信的四种方式
- 关于Fragment与Fragment、Activity通信的四种方式
- 二分查找树