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.free和delete都可以释放NULL指针。?

四、不同:

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

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同时完成了清理和释放内存的工作,而malloc和free不可以。

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。但是必须要配套使用。

时间: 2024-12-20 20:02:05

malloc/free 和 new/delete的相关文章

比较malloc/free和new/delete

比较malloc/free和new/delete ??涉及到内存分配时,经常用到malloc与free.malloc与free是C++/C的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. ??对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于 malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加

C++拾遗--malloc free与new delete的同与不同

C++拾遗--malloc free与new delete的同与不同 前言 在C中我们常使用malloc和free来动态分配与释放内存,在C++中对应的是new和delete.这里我们来探讨下他们的同与不同. 正文 1.内置类型 对相同的代码进行调试,查看内存 #include <iostream> using namespace std; int main() { int *p = (int*)malloc(sizeof(int) * 10); cout << p <<

malloc/free与new/delete的区别

相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求.对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数.由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free. (2)用法上也有所不同.函数malloc 的原

malloc/free和new/delete的区别汇总

一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void* FirstByte):该函数是将之前用malloc分配的空间还给程序或者操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回,指向被分配的内

malloc free 和new delete区别

从网上看的学习之 1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+"."-"."*"."/"有一样的地位. 2. new/delete是可以重载的,而重载之后,就成为了函数. 3. malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,必须要强转成需要的类型. 4. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存

malloc/free、new/delete 区别

1. Malloc:malloc/free是C++和C的标准库函数,可用于申请动态内存和释放内存.对于非内部数据类型的对象而言,光用 malloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是 库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 2. New:new/delete是C++的运算符.可用于申请动态内存和释放内存.C++语言需要一个能完成动

百度笔试题:malloc/free与new/delete的区别(转)

百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和delete是C++的运算符.对于非内部数据类的对象而言,光用malloc/free 无法满足动态对象的要求.对象在创建时要自动执行构造函数,对象消亡之前要自动执行析构函数,malloc和free是库函数而不是运算符,不在编译器的控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/f

malloc/free 与 new/delete的区别和联系

一.基本概念  malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被

malloc/free和new/delete的异同

一.基本概念 malloc/free: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回一个空指针(NULL). void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由. 2.内存操作: malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分