new
/ delete
和malloc
/ free
之间有什么区别?
答案 0 :(得分:450)
表格特征比较:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
技术上,new分配的内存来自'Free Store',而malloc分配的内存来自'Heap'。这两个区域是否相同是一个实现细节,这是malloc和new不能混合的另一个原因。
答案 1 :(得分:79)
最相关的区别是new
运算符分配内存然后调用构造函数,delete
调用析构函数然后释放内存。
答案 2 :(得分:29)
new
调用对象的ctor,delete
调用dtor。
malloc
& free
只需分配和释放原始内存。
答案 3 :(得分:13)
在C ++中new
/ delete
相应地调用构造函数/析构函数。
malloc
/ free
只是从堆中分配内存。 new
/ delete
也会分配内存。
答案 4 :(得分:12)
new
/ delete
是C ++,malloc
/ free
来自优秀的旧C。
在C ++中,new
调用对象构造函数,delete
调用析构函数。
malloc
和free
仅分配并释放内存,而不执行任何对象的代码。
答案 5 :(得分:10)
唯一的相似之处是malloc
/ new
都返回一个指针,它指向堆上的某些内存,并且它们都保证一旦返回了这样的内存块,它就不会除非您先取消/删除它,否则请再次退回。也就是说,它们都“分配”内存。
但是,new
/ delete
还可以通过构造函数,析构函数和运算符重载执行任意其他工作。 malloc
/ free
只能分配和释放内存。
实际上,new
可以自定义,它不一定从堆返回内存,甚至根本不分配内存。但是默认new
会这样做。
答案 6 :(得分:6)
new和malloc之间的主要区别是new调用对象的构造函数,相应的delete调用调用对象的析构函数。
还有其他不同之处:
new
是类型安全的,malloc
返回void*
类型的对象
new
在出错时抛出异常,malloc
返回NULL
并设置错误
new
是一个操作符,可以重载,malloc
是一个函数,无法重载
new[]
比malloc
malloc
- 派生的分配可以通过realloc
调整大小,new
- 派生的分配无法调整大小
malloc
可以分配一个N字节的内存块,new
必须要求分配一个数组,比如char
类型
看看差异,总结是malloc是C-esque,new是C ++ - esque。使用适合您的代码库的那个。
尽管使用不同的内存分配算法实现new和malloc是合法的,但在大多数系统中,new使用malloc在内部实现,不会产生系统级差异。
答案 7 :(得分:5)
new
malloc
没有new
做的一些事情:
new
通过调用该对象的构造函数来构造对象malloc
不需要对已分配的内存进行类型转换。所以,如果你使用new
,那么你需要明确地做上面的事情,这并不总是实际的。此外,malloc
可能会过载,但new
不能重载。
总之,如果您使用C ++,请尝试尽可能使用{{1}}。
答案 8 :(得分:4)
也
全局new和delete可以被覆盖,malloc / free不能。
每种类型都可以覆盖更多新的和删除。
答案 9 :(得分:3)
new
和delete
是C ++ primitives ,它声明一个类的新实例或删除它(从而为实例调用类的析构函数)。
malloc
和free
是C 函数,它们分配和释放内存块(大小)。
两者都使用堆来进行分配。 malloc
和free
更加“低级别”,因为它们只保留了一块可能与指针相关联的内存空间。在该内存周围没有创建任何结构(除非您将C数组视为结构)。
答案 10 :(得分:2)
答案 11 :(得分:1)
malloc()
,我们需要包含 <stdlib.h>
或
程序中的<alloc.h>
new
。new
和delete
可能会超载但malloc
无法重载。new
,我们可以传递我们想要的地址
分配内存,但在malloc
。答案 12 :(得分:0)
此代码用于删除关键字或自由功能。但是当创造一个 指针对象使用'malloc'或'new'并释放对象内存使用 甚至删除该对象指针也可以在类中调用函数。后 使用免费而不是删除然后它也可以在免费声明后使用, 但是当使用两者时,只有指针对象无法调用类中的函数。 代码如下:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
输出:
Hello Hi 0x2abfef37cc20
答案 13 :(得分:-3)
1.new syntex比malloc()
简单2.new/delete是malloc()/ free()的运算符 是一个功能。
3.new/delete执行速度比malloc()/ free()快,因为编译器直接粘贴了新的汇编代码。
4.我们可以在运算符重叠的帮助下更改程序中的新/删除含义。