当前位置:  开发笔记 > 编程语言 > 正文

new/delete和malloc/free有什么区别?

如何解决《new/delete和malloc/free有什么区别?》经验,为你挑选了8个好方法。

new/ deletemalloc/有free什么区别?

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



1> Martin York..:

新/删除

分配/释放内存

    从"免费商店"分配的内存

    返回一个完全类型的指针.

    new(标准版)永远不会返回NULL(将失败)

    用Type-ID调用(编译器计算大小)

    有明确的版本来处理数组.

    重新分配(以获得更多空间)不能直观地处理(因为复制构造函数).

    他们是否调用malloc/free是实现定义的.

    可以添加新的内存分配器来处理低内存(set_new_handler)

    可以合法地覆盖operator new/delete

    用于初始化/销毁对象的构造函数/析构函数

的malloc /免费

分配/释放内存

    从'Heap'分配的内存

    返回void*

    失败时返回NULL

    必须以字节为单位指定所需的大小.

    分配阵列需要手动计算空间.

    重新分配更大的内存块(无需复制构造函数)

    他们不会打电话给新/删除

    无法将用户代码拼接到分配序列中以帮助降低内存.

    的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                            

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


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

2> Trap..:

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


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

3> James Curran..:

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

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


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

4> 小智..:

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

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



5> Treb..:

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

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

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


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

6> Steve Jessop..:

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

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

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



7> Walter..:

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



8> herohuyongta..:

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

    new 通过调用该对象的构造函数来构造对象

    new 不需要对已分配的内存进行类型转换.

    它不需要分配大量内存,而是需要构造许多对象.

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

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

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有