关于 malloc 和 new 在各自处理内存分配的机制方面的区别? [复制]
Posted
技术标签:
【中文标题】关于 malloc 和 new 在各自处理内存分配的机制方面的区别? [复制]【英文标题】:Regarding the differences between malloc and new in terms of their respective mechanisms of handling memory allocation? [duplicate] 【发布时间】:2011-11-28 12:41:13 【问题描述】:malloc 和 new 在各自处理内存分配的机制方面有什么区别?
【问题讨论】:
malloc
不会像我想的那样抛出bad_alloc
exepetion as new
malloc
和 free
不调用对象构造函数和析构函数。
以上 cmets 添加到社区 wiki 答案。
parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.4
请看***.com/questions/7443782/…
【参考方案1】:
malloc
不会像 new
那样抛出 bad_alloc
异常。
因为 malloc 不会抛出异常,所以您必须对照 NULL
(或 c++11 及更高版本中的 nullptr)检查其结果,而 new
则不需要。但是,new
可以以不会引发期望的方式使用,例如设置函数 set_new_handler
时
malloc
和 free
不调用对象构造函数和析构函数,因为 C
中没有对象。
见this question和this post。
【讨论】:
另外,因为 malloc 不会抛出异常,你必须对照 NULL 检查它的结果,而 new 则不需要。 可以多加两点:(1)放置new
(2)malloc/realloc
的兼容性。
@iammilind 好的,通过编辑答案来添加它们【参考方案2】:
你的意思是它们是如何实现的?
它们可以实现为任何东西,只是malloc
不能调用new
,所有标准new
s 必须调用全局operator new(void*)
。通常new
甚至被实现为调用malloc
,但对如何实现没有要求。那里甚至有几十个分配器,每个都有一些优势和一些周末。
或者您的意思是它们在语言层面上有何不同?
new
在分配错误时抛出(除非使用 std::nothrow
调用)。 new 表达式(不是 operator new)调用 ctor。
malloc
在分配失败时返回 0
。
【讨论】:
【参考方案3】:如果调用失败,new
将抛出异常,而malloc
将返回NULL
。
对于malloc
,调用者必须指定要分配的内存量,而new
会自动确定。
这些差异与分配有关,还有很多其他差异 - new 将调用构造函数,new 可以重载,new 是运算符,而 malloc 是函数...
【讨论】:
【参考方案4】:嗯,malloc()
是一个更底层的原语。它只是给你一个指向 n 字节堆内存的指针。 C++ new
运算符更“智能”,因为它“知道”正在分配的对象的类型,并且可以执行诸如调用构造函数之类的操作,以确保新分配的对象都被正确初始化。
new
的实现通常最终调用 malloc()
来获取原始内存,然后在该内存之上执行操作以初始化正在构造的对象。
【讨论】:
以上是关于关于 malloc 和 new 在各自处理内存分配的机制方面的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章