Mar*_*ork 460

新/删除

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

的malloc /免费

  • 分配/释放内存
    1. 从'Heap'分配的内存
    2. 返回void*
    3. 失败时返回NULL
    4. 必须以字节为单位指定所需的大小.
    5. 分配阵列需要手动计算空间.
    6. 重新分配更大的内存块(无需复制构造函数)
    7. 他们不会打电话给新/删除
    8. 无法将用户代码拼接到分配序列中以帮助降低内存.
    9. 的malloc /免费可以合法覆盖

表格比较功能:

 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                            
Run Code Online (Sandbox Code Playgroud)

技术上,new分配的内存来自'Free Store',而malloc分配的内存来自'Heap'.这两个区域是否相同是一个实现细节,这是malloc和new不能混合的另一个原因.

  • 有人可以编辑来详细说明"免费商店"而不是堆吗?进程'堆是一个众所周知的语言无关(?)操作系统级概念; "免费商店"来自哪里? (11认同)
  • @winterlight:曾经是真实但不再是.请参阅:http://linux.die.net/man/3/free`如果ptr为NULL,则不执行任何操作 (4认同)
  • @LokiAstari看起来像'堆','免费商店'和'动态内存/存储'是同义词:在Bjarne Stroustrup的**C++之旅**中,他说"`new`运算符从*分配内存free store*(也称为*dynamic memory*和*heap*).关于**动态存储**的C++ 14标准,第3.7.4节说"可以在程序执行期间动态创建对象(1.9),使用new-表达式(5.3.4),并使用delete-expressions销毁." (2认同)
  • @mheiber:这意味着它们可以相同。并且有几种实现通过调用malloc来实现new(请注意,明确禁止使用另一种方法)。但是有几种实现方式使这些存储区完全分开。仍然将它们分开的原因是,这允许以与C内存管理不同的方式优化C ++内存管理代码。关键是:它们可以相同,但是您不能假设它们是相同的。 (2认同)

Tra*_*rap 80

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

  • 严格来说,new运算符只是分配内存.它是调用new运算符的新表达式,然后在分配的内存中运行构造函数. (22认同)
  • @mgb:是的,你是对的,在"应用程序堆"或堆栈上分配对象.__But__ @RobH指的是标准称为"应用程序堆"的不同部分.有一个"堆"是malloc分配内存的地方,"Free Store"是新分配内存的地方.虽然在__some__实现中这些区域确实重叠(这是一个实现细节). (2认同)

Jam*_*ran 29

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

malloc&free只需分配和释放原始内存.

  • 原始记忆没有做任何事情.尚未构造任何对象,没有任何内容被复制到其中,并且在大多数情况下,之前的内容尚未被覆盖. (3认同)

小智 13

在C++ new/ delete相应地调用构造/析构.

malloc/ free只需从堆中分配内存.new/也delete分配内存.


Tre*_*reb 13

new/ delete是C++,malloc/ free来自好老C.

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

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

  • "来自OO之前的黑暗时代"听起来像是暗示新/删除*比malloc/free更好*实际上,无论是好还是坏,它们只是有不同的用途.请注意,我不是那个贬低你的人,我只是在猜测. (9认同)

Ste*_*sop 10

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

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

实际上,new可以充分定制,它不一定从堆返回内存,甚至根本不分配内存.但默认情况下new.


Wal*_*ter 7

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在内部实现,不会产生系统级差异.


her*_*tao 5

有一些事情new没有malloc做到:

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

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

总之,如果您使用C++,请尝试new尽可能多地使用.