关于 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 mallocfree 不调用对象构造函数和析构函数。 以上 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_handlermallocfree 不调用对象构造函数和析构函数,因为 C 中没有对象。 见this question和this post。

【讨论】:

另外,因为 malloc 不会抛出异常,你必须对照 NULL 检查它的结果,而 new 则不需要。 可以多加两点:(1)放置new(2)malloc/realloc的兼容性。 @iammilind 好的,通过编辑答案来添加它们【参考方案2】:

你的意思是它们是如何实现的?

它们可以实现为任何东西,只是malloc 不能调用new,所有标准news 必须调用全局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 在各自处理内存分配的机制方面的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是使用 malloc 或 new 分配了内存

new与malloc的区别struct与class的区别

new与malloc的区别struct与class的区别

关于new的堆栈问题

细说new与malloc的10点区别

细说new与malloc的10点区别