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

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


当前回答

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

malloc和free是C函数,它们分配和释放内存块(大小)。

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

其他回答

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

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

有几件事是new做的,malloc没有:

New通过调用该对象的构造函数来构造该对象 New不需要对已分配的内存进行类型转换。 它不需要分配大量的内存,而是需要大量的内存 要构造的对象。

因此,如果使用malloc,则需要显式地执行上述操作,这并不总是实际的。此外,new可以重载,但malloc不能。

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

新建/删除

Allocate / release memory Memory allocated from 'Free Store'. Returns a fully typed pointer. new (standard version) never returns a NULL (will throw on failure). Are called with Type-ID (compiler calculates the size). Has a version explicitly to handle arrays. Reallocating (to get more space) not handled intuitively (because of copy constructor). Whether they call malloc / free is implementation defined. Can add a new memory allocator to deal with low memory (std::set_new_handler). operator new / operator delete can be overridden legally. Constructor / destructor used to initialize / destroy the object.

Malloc / free

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

特点对比表:

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 constructor / destructor Yes No

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

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

此代码用于使用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;
}

输出: 你好 嗨 0 x2abfef37cc20