malloc/free 和 new/delete

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了malloc/free 和 new/delete相关的知识,希望对你有一定的参考价值。

一、Malloc/free

1.Malloc的原型:(#include <malloc.h>)

Void * malloc(size_t size);   //  Void * malloc(unsigned int num_bytes);

如果分配失败,则返回NULL,否则返回申请内存的首地址。malloc本身并不识别要申请内存的类型(返回类型为void *),只关心内存的字节数,因此必须显式的进行类型转化。

2.Free的原型:

Void free(void *memblock);

如果free(p)中,p==NULL,那么无论free无论操作多少次都不会出错,如果p!=NULL,那么连续对p free 两次就会出错。

二、New/delete  new[]/[]delete

new operator由两步构成,operator new construct

Delete operator 由两步构成,operator delete destroy

三、相同:

1.都可以进行动态内存分配和释放。

2.freedelete都可以释放NULL指针。?

四、不同:

1.malloc/free C/C++语言的标准库函数,new/deleteC++的运算符。

Operator new对应于malloc,但是operator new 可以重载,可以自定义内存分配的策略,甚至分配到非内存设备上,但是malloc不能。

2.new能够自动分配空间大小,而malloc需要计算字节数。

New内置了sizeof、类型转换和类型安全检查功能。

3.New是类型安全的,malloc不是。

Int *p=new float[2]//编译错误

Int *p=malloc(sizeof(float)*2);//编译时无法指出错误。

4.对于非内部数据类型的对象而言,对象在创建的同时需要自动执行构造函数,对象在消亡之前需要自动执行析构函数。New同时完成了对象的动态内存分配和初始化工作,delete同时完成了清理和释放内存的工作,而mallocfree不可以。

5.Malloc分配失败时,返回空指针。

Operator new分配失败时,抛出std::bad_alloc异常,但是继续提供返回0的功能。但是在使用new的入口点采用了nothrow对象。

Student *stu=new (nothrow) student;//若分配失败返回0

If(stu==0)  //该检查可能会成功。

6.Malloc申请的是heap的内存空间,new申请的是free store的内存空间。

五、联系:

由于C++经常要调用C函数,所以C++还保留着malloc/free。但是必须要配套使用。

 

以上是关于malloc/free 和 new/delete的主要内容,如果未能解决你的问题,请参考以下文章

malloc/free 和 new/delete

C++内存管理第一篇:(malloc/deldete和malloc/free)

面试中常被问到new/delete和malloc/free区别

堆的分配和释放(malloc,free,calloc,realloc)

malloc/free 的使用要点

malloc/free 的使用要点