malloc/free和new/delete的区别
2013-11-18 20:45
302 查看
本质区别
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。
对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
对于非内置数据类型,在进行动态创建的时候很多情况下是需要初始化的,使用malloc只是分配了空间,但是未进行初始化,这是一种不安全的做法;在销毁一个动态分配的非内置类型对象的时候的使用free只是销毁了该对象存储的空间,但是未进行必要的清理工作,在C++中表现出不来的是未使用析构函数,在该非内置类型中存在指针成员变量的时候是容易发生内存泄露的危险的。
但是我们使用new和delete就不同了,当使用new的时候就会自动调用该非内置类型的constructor,完成对象的初始化工作,调用delete的时候自动调用destructor,自动完成清理的工作。
(参考:http://blog.csdn.net/hackbuteer1/article/details/6789164)
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。
对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
对于非内置数据类型,在进行动态创建的时候很多情况下是需要初始化的,使用malloc只是分配了空间,但是未进行初始化,这是一种不安全的做法;在销毁一个动态分配的非内置类型对象的时候的使用free只是销毁了该对象存储的空间,但是未进行必要的清理工作,在C++中表现出不来的是未使用析构函数,在该非内置类型中存在指针成员变量的时候是容易发生内存泄露的危险的。
但是我们使用new和delete就不同了,当使用new的时候就会自动调用该非内置类型的constructor,完成对象的初始化工作,调用delete的时候自动调用destructor,自动完成清理的工作。
(参考:http://blog.csdn.net/hackbuteer1/article/details/6789164)
相关文章推荐
- 【转】linux 安装Tesseract-OCR
- vs2010使用vld检测内存泄露
- 曹重英:技术人员也要打造人脉竞争力
- 如何控制hadoop中map和reduce任务的数量
- 物联网项目---M0系统设置和时钟设置
- html用a标签怎么提交表单?
- 浅析字符串和字符数组区别
- 查GDI对象泄露的利器:GDIView
- 自定义ClassLoader在一个JVM启动多个Peer实例
- 线索二叉树
- POJ 1502 MPI Maelstrom
- 使用两个队列实现一个栈,使用两个栈实现一个队列!
- 美能达早期经典手动单反相机比较表
- hdu 4784 Dinner Coming Soon
- MongoDB实战(8)性能监控
- MongoDB实战(8)性能监控
- C++里的虚函数表
- 故障后的反省及运维的体会
- 找树根和孩子
- Java Concurrency In Practice