首页 > 试题广场 >

malloc和new有什么区别?

[问答题]
malloc和new有什么区别?
推荐
1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
编辑于 2015-07-26 21:41:03 回复(0)
我刚刚总结了new与malloc的10点区别,有兴趣的同学可以看看
http://www.cnblogs.com/QG-whz/p/5140930.html
发表于 2016-01-19 11:31:59 回复(2)
1.操作对象有所不同
malloc和free是c++/c语言的标准库函数;而new和delete是c++的运算符,对于非内部数据类的对象而言,光用malloc无法满足动态对象的要求,因为对象在创建的时候要执行构造函数,对象在消亡之前要执行析构函数。由于malloc是库函数而不是运算符,不在编译器控制权限之内,不能把执行构造函数和析构函数的任务强加malloc.
2.用法上不同
1)malloc函数原型: void* malloc(size_t size) ;用malloc申请一块长度为length的整数类型的内存,程序为:int* p = (int*)malloc(sizeof(int)*length);
注意2点:A:类型转换,因为malloc的类型为void*;B:sizeof
malloc本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。
2)对比malloc,new要简单一些
int* p1 = (int*)malloc(sizeof(int)*length);
int* p2 = new int[length];
这是因为new内置了sizeof. 类型转换和类型安全检查功能。

发表于 2015-06-18 15:22:19 回复(0)
补充:
new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。

使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算,而malloc则需要显式地指出所需内存的尺寸。

C++提供了new[]与delete[]来专门处理数组类型:,至于malloc,它并知道你在这块内存上要放的数组还是啥别的东西,反正它就给你一块原始的内存,在给你个内存的地址就完事。

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从上动态分配内存。
  • 自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,而堆(heap)是C语言和操作系统的术语,是操作系统维护的一块动态分配内存。

  • new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储,可以说new所申请的内存区域在堆上。

  • 堆与自由存储区还是有区别的,它们并非等价。



发表于 2017-11-30 19:42:15 回复(0)
发表于 2015-09-05 18:42:49 回复(0)
相同点:
    malloc 和 new 都用于动态分配内存。
区别:
1.malloc是标准库函数,需要库文件stdlib.h,new是c++运算符,不需要库文件
2.malloc分配内存前需要手工计算分配多大空间,new能自动计算需要分配的内存空间
3.malloc是最底层函数,不会调用构造函数,函数返回值是void*, new运算符需要调用构造函数,函数    返回相应对象类型的指针
4.new是类型安全的,如int *p=new float[2],编译器会报错。 而malloc不是, int         *p=malloc(2*sizeof(float))编译时编译器无法指出错误
5.new一般由两步构成,分别是new操作和构造,new对应malloc,但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存设备上,而malloc不能

发表于 2015-06-12 09:45:11 回复(0)
百度面试问到了这个
发表于 2017-05-03 20:03:27 回复(0)
补充几点:new 不一定调用malloc的。这题可以结合stl allocator来回答的。
发表于 2015-08-31 17:09:01 回复(0)
malloc/free是C lib库,new/delete是C++运算符
malloc用来分配堆内存
new会先分配内存资源利用operator::new,然后执行构造函数
发表于 2015-07-26 20:37:00 回复(0)
1.new/delete是C++操作符,malloc/free是C/C++函数。
2.new的对象需要调用构造函数,malloc不会调用。
3.new返回对象指针,malloc返回void*。
4.new是类型安全的,malloc不检查。
发表于 2015-07-26 10:47:16 回复(0)
1、new 返回指定类型的指针,并且可以自动计算所需要大小。
1) int *p;      p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
或:int* parr;  parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100; 
2、而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int)*128);//分配128个(可根据实际需要替换该数值)整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中  
double *pd=(double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
3、malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
4、有了malloc/free为什么还要new/delete?
1) malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2) 对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,
对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数
和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,
对它们而言malloc/free和new/delete是等价的。
3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,
而C程序只能用malloc/free管理动态内存。
如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放
“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
发表于 2015-07-08 10:18:03 回复(0)
malloc和free是c,c++标准库函数,它们都可以用于动态申请内存和释放内存
对于非内部数据类型的对象而言,光用malloc和free无法满足动态对象的要求。对象在创建时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc和free是标准库函数不是运算符,不在编译器控制范围之内,不能把执行构造函数和析构函数的任务强加于malloc和free
因此c++语言需要一个能够完成动态内存分配和初始化工作的运算符new和一个能完成清理和释放内存的运算符delete
C++程序经常要调用c函数,而c程序只能用malloc和free管理内存
发表于 2015-05-31 13:35:05 回复(0)
malloc:是个函数,不会调用c++class的构造函数,返回void*
new: c++ 操作符,非配内存,调用构造函数,返回相应类型的指针
发表于 2015-05-31 10:27:41 回复(0)
malloc是最底层的内存分配操作符,new的过程最终也是通过malloc实现内存分配的,


C++中 对于基本数据类型 malloc 和new 无差别,但是对于类类型,二者实现的过程不一样,就是上面说的。
malloc可以在C和C++中使用,new只能在C++中使用,
发表于 2015-05-30 22:50:20 回复(0)
malloc是c语言的库函数,new是c++里面的一种运算符
发表于 2015-05-29 18:43:31 回复(0)
• malloc/free 是C语言的库函数,new/delete是C++的操作符?
• malloc仅仅用来分配内存,而不会执行相应的构造函数,函数返回值为void*,而new会调用相应的 构造函数,返回的是相应对象类型的指针
发表于 2015-05-05 14:22:47 回复(0)