malloc和new的实现差异.堆栈实现?

Shr*_*rey 4 c++ algorithm memory-management

在分配内存时,如果内存不可用,则new运算符会抛出异常.另一方面,malloc返回NULL.实施差异的原因是什么?另外,在静态内存分配上,即在堆栈上,如果内存不足,会有异常吗?

我已经通过链接new/delete和malloc/free有什么区别? 但是我没有得到关于两者实施差异的答案

Mar*_*ork 5

C代码的问题是你应该检查函数的返回值,以确保它们正常工作.但是很多代码都是在没有检查返回值的情况下编写的,因此当你最不期望的时候会很好地爆炸.

在最糟糕的情况下,它甚至不会立即崩溃,而是继续破坏内存在错误的下游几英里处崩溃.

因此,在C++中,异常诞生了.
现在当出现错误时代码不会继续(因此没有内存损坏)但是展开堆栈(可能会强制应用程序退出).如果您可以处理该问题,则必须在继续之前显式添加代码以处理该情况.这样你就不会忘记不检查错误情况; 您要么检查它,要么应用程序将退出.

新设计的使用符合这种设计.
如果您未能分配内存,则必须显式处理错误.
没有机会忘记检查NULL指针.因此,你不能意外地使用NULL指针去搞乱内存.

另外,在静态内存分配上,即在堆栈上,如果内存不足,会有异常吗?

不幸的是你不能依靠这个.
它是实现定义堆栈溢出时发生的事情.在许多系统上,甚至无法检测到导致内存损坏并最终可能导致崩溃的情况.

注意

如果你#include <new>那么你可以使用一个no throw版本的new,当没有内存时返回NULL.除非有一些特殊需要,否则最好避免使用.