new
/delete
和malloc
/和有什么不一样free
?
相关(重复?):在什么情况下我使用 malloc 与 new?
new
/delete
new
(标准版)从不返回 a NULL
(将抛出失败)。malloc
/free
是实现定义的。std::set_new_handler
)。operator new
/operator delete
可以合法地被覆盖。malloc
/free
void*
.NULL
。new
/ delete
。malloc
/free
不能合法地被覆盖。特征 | new /delete |
malloc /free |
---|---|---|
分配的内存 | '免费商店' | '堆' |
退货 | 全类型指针 | void* |
失败时 | 投掷(永不返回NULL ) |
退货NULL |
所需尺寸 | 由编译器计算 | 必须以字节为单位指定 |
处理数组 | 有明确的版本 | 需要手动计算 |
重新分配 | 处理不直观 | 简单(无复制构造函数) |
反转的呼唤 | 实现定义 | 不 |
内存不足的情况 | 可以添加新的内存分配器 | 不由用户代码处理 |
可覆盖 | 是的 | 不 |
构造函数/析构函数的使用 | 是的 | 不 |
从技术上讲,分配的内存new
来自“免费存储”,而分配的内存malloc
来自“堆”。这两个区域是否相同是一个实现细节,这是另一个malloc
不能new
混为一谈的原因。
最相关的区别是new
运算符分配内存然后调用构造函数,delete
调用析构函数然后释放内存。
new
调用对象的ctor,delete
调用dtor。
malloc
&free
只是分配和释放原始内存。
new
/delete
是 C++,malloc
/free
来自古老的 C。
在 C++ 中,new
调用对象构造函数并delete
调用析构函数。
malloc
并且free
,来自OO之前的黑暗时代,只分配和释放内存,不执行对象的任何代码。
在 C++ new
/delete
中相应地调用构造函数/析构函数。
malloc
/free
简单地从堆中分配内存。new
/delete
也分配内存。
唯一的相似之处是malloc
/new
都返回一个指向堆上一些内存的指针,并且它们都保证一旦返回了这样的内存块,除非您先释放/删除它,否则它不会再次返回。也就是说,它们都“分配”内存。
但是,new
/delete
还可以通过构造函数、析构函数和运算符重载执行任意其他工作。malloc
/free
只分配和释放内存。
事实上,new
它是充分可定制的,它不一定从堆中返回内存,甚至根本不需要分配内存。但是,默认值new
会。
new 和 malloc 的主要区别在于 new 调用对象的构造函数,而相应的 delete 调用调用对象的析构函数。
还有其他区别:
new
是类型安全的,malloc
返回类型的对象void*
new
出错时抛出异常,malloc
返回NULL
并设置 errno
new
是运算符,可以重载,malloc
是函数,不能重载
new[]
,它分配数组,比malloc
malloc
-派生的分配可以通过调整大小realloc
, -new
派生的分配不能调整大小
malloc
可以分配一个 N 字节的内存块,new
必须要求分配一个数组,比如说,char
类型
看看差异,总结一下 malloc 是 C-esque,new 是 C++-esque。使用适合您的代码库的那个。
尽管 new 和 malloc 使用不同的内存分配算法实现是合法的,但在大多数系统上,new 在内部使用 malloc 实现,不会产生系统级别的差异。
有一些事情new
不会malloc
:
new
通过调用该对象的构造函数来构造该对象new
不需要对分配的内存进行类型转换。所以,如果你使用malloc
,那么你需要明确地做上面的事情,这并不总是实用的。此外,new
可以重载但malloc
不能重载。
总之,如果你使用C++,尽量使用new
。
还,
全局 new 和 delete 可以被覆盖, malloc/free 不能。
每种类型都可以覆盖更多的 new 和 delete。
new
并且delete
是 C++原语,它声明一个类的新实例或删除它(从而为实例调用类的析构函数)。
malloc
并且free
是 C函数,它们分配和释放内存块(按大小计)。
两者都使用堆进行分配。malloc
并且free
仍然更加“低级”,因为它们只是保留了一块可能与指针相关联的内存空间。没有围绕该内存创建任何结构(除非您将 C 数组视为结构)。
new 和 delete 是 C++ 中的运算符;这也可以超载。malloc 和 free 是 c 中的函数;
当 new 抛出异常时 malloc 失败时返回 null ptr。
malloc 返回的地址需要再次进行类型转换,因为它返回 (void*)malloc(size) New 返回类型化指针。
malloc()
,我们需要在程序中包含 <stdlib.h>
或
<alloc.h>
不需要的new
。new
并且delete
可以重载但malloc
不能。new
,我们可以传递我们要分配内存的地址,但在malloc
.此代码用于删除关键字或免费功能。但是,当使用“malloc”或“new”创建指针对象并使用 delete 释放对象内存时,即使该对象指针也可以在类中调用函数。之后使用 free 而不是 delete 然后它也可以在 free 语句之后工作,但是当同时使用两者时,只有指针对象不能调用类中的函数..代码如下:
#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
1.new syntex 比 malloc() 更简单
2.new/delete 是一个运算符,其中 malloc()/free() 是一个函数。
3.new/delete 执行速度比 malloc()/free() 快,因为新的汇编代码直接由编译器粘贴。
4.我们可以通过操作符叠加来改变程序中新/删除的含义。