Malloc/new和delete/free的区别

来源:互联网 发布:丰城网络问政平台 编辑:程序博客网 时间:2024/05/20 14:23

http://blog.csdn.net/hackbuteer1/article/details/6789164

http://blog.csdn.net/hackbuteer1/article/details/7542774

相同点:都可用于申请动态内存和释放内存

本质区别:malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。

第一个体现在对飞内部数据类型对象的操作上:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。对于非内部数据类的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。

第二个体现在操作符重载上:operator new对应于malloc,但operator new可以重载,可以自定义内存分配策略,甚至不做内存分配,甚至分配到非内存设备上。而malloc无能为力

第三个体现在是否需要库支持上:mallocfree需要库文件支持,因为它们是库函数

 

用法的区别上:

1.   malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void*转换成所需要的指针类型。

2.   malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。

3.   如果p是NULL指针,那么free对p无论操作多少次都不会出问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

4.   new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,new在创建动态对象同时完成了初始化工作。

5.   在申请和释放数组空间时候也有区别

6.   既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete、malloc/free必须配对使用。

 

最后要注意,无论是delete还是free之后都要把指针置空,否则会造成野指针。

0 0
原创粉丝点击