292

new/deletemalloc/和有什么不一样free

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

4

15 回答 15

485

new/delete

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

malloc/free

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

功能表对比:

特征 new/delete malloc/free
分配的内存 '免费商店' '堆'
退货 全类型指针 void*
失败时 投掷(永不返回NULL 退货NULL
所需尺寸 由编译器计算 必须以字节为单位指定
处理数组 有明确的版本 需要手动计算
重新分配 处理不直观 简单(无复制构造函数)
反转的呼唤 实现定义
内存不足的情况 可以添加新的内存分配器 不由用户代码处理
可覆盖 是的
构造函数/析构函数的使用 是的

从技术上讲,分配的内存new来自“免费存储”,而分配的内存malloc来自“堆”。这两个区域是否相同是一个实现细节,这是另一个malloc不能new混为一谈的原因。

于 2008-10-27T15:28:19.560 回答
84

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

于 2008-10-27T15:07:35.827 回答
31

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

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

于 2008-10-27T15:08:30.163 回答
16

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

在 C++ 中,new调用对象构造函数并delete调用析构函数。

malloc并且free,来自OO之前的黑暗时代,只分配和释放内存,不执行对象的任何代码。

于 2008-10-27T15:08:43.203 回答
13

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

malloc/free简单地从堆中分配内存。new/delete也分配内存。

于 2008-10-27T15:08:36.527 回答
10

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

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

事实上,new它是充分可定制的,它不一定从堆中返回内存,甚至根本不需要分配内存。但是,默认值new会。

于 2008-10-27T15:11:30.453 回答
10

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 实现,不会产生系统级别的差异。

于 2014-10-08T08:52:34.953 回答
5

有一些事情new不会malloc

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

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

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

于 2014-01-15T14:48:06.233 回答
4

还,

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

每种类型都可以覆盖更多的 new 和 delete。

于 2008-10-27T15:35:53.867 回答
3

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

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

两者都使用堆进行分配。malloc并且free仍然更加“低级”,因为它们只是保留了一块可能与指针相关联的内存空间。没有围绕该内存创建任何结构(除非您将 C 数组视为结构)。

于 2008-10-27T15:09:31.143 回答
2

new 和 delete 是 C++ 中的运算符;这也可以超载。malloc 和 free 是 c 中的函数;

当 new 抛出异常时 malloc 失败时返回 null ptr。

malloc 返回的地址需要再次进行类型转换,因为它返回 (void*)malloc(size) New 返回类型化指针。

于 2015-09-10T11:13:28.330 回答
2
  • new 是一个运算符,而 malloc() 是一个函数。
  • new 返回确切的数据类型,而 malloc() 返回 void *(类型为 void 的指针)。
  • malloc(),内存未初始化,默认值为垃圾,而在 new 的情况下,内存使用默认值初始化,如 int 的情况下使用“零 (0)”。
  • delete 和 free() 都可以用于 'NULL' 指针。
于 2015-12-19T06:20:31.700 回答
0
  • 要使用malloc(),我们需要在程序中包含 <stdlib.h><alloc.h>不需要的new
  • new并且delete可以重载但malloc不能。
  • 使用放置new,我们可以传递我们要分配内存的地址,但在malloc.
于 2015-06-18T21:43:47.560 回答
0

此代码用于删除关键字或免费功能。但是,当使用“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
于 2017-11-12T10:27:43.577 回答
-4

1.new syntex 比 malloc() 更简单

2.new/delete 是一个运算符,其中 malloc()/free() 是一个函数。

3.new/delete 执行速度比 malloc()/free() 快,因为新的汇编代码直接由编译器粘贴。

4.我们可以通过操作符叠加来改变程序中新/删除的含义。

于 2017-07-15T14:45:18.560 回答