new/delete和malloc/free的区别是什么?

new/deletemalloc/free之间的区别是什么?

相关(重复?):在什么情况下我使用malloc vs new?

211563 次浏览

最相关的区别是new操作符分配内存,然后调用构造函数,而delete调用析构函数,然后释放内存。

new调用对象的ctor, delete调用对象的dtor。

malloc,free只是分配和释放原始内存。

在c++中,new/delete相应地调用构造函数/析构函数。

malloc/free只是从堆中分配内存。new/delete也分配内存。

new/delete是c++, malloc/free来自古老的C。

在c++中,new调用对象的构造函数,而delete调用析构函数。

mallocfree来自OO之前的黑暗时代,它们只分配和释放内存,而不执行对象的任何代码。

newdelete是c++的原语,它们声明一个类的新实例或删除它(从而为该实例调用类的析构函数)。

mallocfree是C 功能,它们分配和释放内存块(大小)。

两者都使用堆来进行分配。尽管如此,mallocfree是更“低级”的,因为它们只是保留了一块可能与指针相关的内存空间。在该内存周围不会创建任何结构(除非您将C数组视为结构)。

唯一的相似之处是malloc/new都返回一个指向堆上内存的指针,并且它们都保证一旦这样的内存块被返回,它就不会再次返回,除非你先释放/删除它。也就是说,它们都“分配”内存。

然而,new/delete通过构造函数、析构函数和运算符重载执行任意其他工作。malloc/free只分配和释放内存。

事实上,new是足够自定义的,它不一定从堆中返回内存,甚至根本不分配内存。但是默认的new可以。

__abc0 / __abc1

  • 分配/释放内存
    1. 从'Free Store'分配内存。
    2. 返回一个全类型指针。
    3. new(标准版本)从不返回NULL(将在失败时抛出)。
    4. 使用Type-ID调用(编译器计算大小)。
    5. 具有显式处理数组的版本。
    6. 没有直观地处理重新分配(以获得更多空间)(因为复制构造函数)。
    7. 是否调用malloc / free是实现定义的。
    8. 可以添加一个新的内存分配器来处理低内存(std::set_new_handler)。
    9. operator new / operator delete可以被合法覆盖。
    10. 用于初始化/销毁对象的构造函数/析构函数。

__abc0 / __abc1

  • 分配/释放内存
    1. 从“堆”分配内存。
    2. 返回void*
    3. 失败时返回NULL
    4. 必须以字节为单位指定所需的大小。
    5. 分配数组需要手动计算空间。
    6. 分配更大的内存块很简单(不需要担心复制构造函数)。
    7. 它们将调用new / delete
    8. 无法将用户代码拼接到分配序列中以帮助解决低内存问题。
    9. malloc / free可以合法覆盖

特点对比表:

功能 __abc0 / __abc1 __abc0 / __abc1
“自由存储” “堆”
返回 全类型指针 void*
在失败 抛出(从不返回NULL) 返回NULL
需要的大小 由编译器计算 必须以字节为单位指定
处理数组 有一个明确的版本 需要人工计算
重新分配 不是凭直觉处理的 简单(无复制构造函数)
反向呼叫 实现定义 没有
低内存情况 可以添加一个新的内存分配器吗 未被用户代码处理
重写的 是的 没有
构造函数/析构函数的使用 是的 没有

从技术上讲,由new分配的内存来自“Free Store”,而由malloc分配的内存来自“Heap”。这两个区域是否相同是一个实现细节,这是mallocnew不能混合的另一个原因。

同时,

全局的new和delete可以被覆盖,malloc/free不能。

此外,每个类型都可以重写new和delete。

有一些事情new做而malloc不做:

  1. new通过调用对象的构造函数来构造该对象
  2. new不需要对已分配内存进行类型转换。
  3. 它不需要分配一定数量的内存,而是需要一定数量的内存

所以,如果你使用malloc,那么你需要显式地做上面的事情,这并不总是实际的。此外,new可以重载,但malloc不能重载。

总之,如果你使用c++,尽量使用new

new和malloc之间的主要区别是new调用对象的构造函数,而对应的delete调用对象的析构函数。

还有其他不同之处:

  • new是类型安全的,malloc返回类型为void*的对象

  • new在错误时抛出异常,malloc返回NULL并设置errno

  • new是一个操作符,可以重载,malloc是一个函数,不能重载

  • 分配数组的new[]malloc更直观和类型安全

  • __abc0派生的分配可以通过realloc调整大小,__abc2派生的分配不能调整大小

  • malloc可以分配一个n字节的内存块,必须要求new分配一个数组,比如char类型

看区别,总结是malloc是C式的,new是c++式的。使用适合您代码库的版本。

虽然使用不同的内存分配算法实现new和malloc是合法的,但在大多数系统上,new是使用malloc在内部实现的,不会产生系统级的差异。

    要使用malloc(),我们需要包括 <stdlib.h><alloc.h>在程序中,这不是new所需要的
  • newdelete可以重载,但malloc不能。
  • 使用放置new,我们可以将地址传递到我们想要的地方 分配内存,但这在malloc的情况下是不可能的

new和delete是c++中的操作符;也可以重载。 在c中,Malloc和free是函数

Malloc返回空PTR失败时,而新的抛出异常。

地址需要再次按类型强制转换,因为它返回(void*)malloc(size) 新返回类型化指针
  • New是一个操作符,malloc()是一个函数。
  • New返回精确的数据类型,而malloc()返回void * (void类型指针)。
  • Malloc(),内存没有初始化,默认值是垃圾,而在new的情况下,内存用默认值初始化,就像int的情况下用'zero(0)'。
  • delete和free()都可以用于'NULL'指针。

1.New syntex比malloc()简单

< p > 2。New /delete是一个运算符,其中malloc()/free()

3.New /delete执行速度比malloc()/free()快,因为编译器直接粘贴了新的程序集代码。

4.我们可以通过操作符重叠来改变程序中的new/delete含义。

此代码用于使用delete关键字或free函数。但是当创建一个 指针对象使用'malloc'或'new'释放对象内存使用 删除即使对象指针也可以调用类中的函数。后 使用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