malloc和new的实现差异。 堆栈实现?
在分配内存时,如果内存不可用,新运算符会引发异常。 另一方面,malloc返回一个NULL。 执行差异的原因是什么? 另外,在静态内存分配上,即在堆栈上,如果内存不足,是否会有异常?
我已经通过链接new / delete和malloc / free有什么区别? 但没有得到我对这两者实施差异的回答
C代码的问题在于你应该检查函数的返回值以确保它们正常工作。 但是写了很多代码,没有检查返回值,结果在最不出意料的时候爆炸得非常好。
在最糟糕的情况下,它甚至不会立即崩溃,而是继续破坏错误下游某处英里的内存崩溃。
因此在C ++中出现异常。
现在,当出现错误时,代码不会继续(因此没有内存损坏),但会展开堆栈(可能会强制应用程序退出)。 如果您可以处理问题,则必须在继续之前明确添加代码以处理这种情况。 因此你不会意外忘记不检查错误情况; 你要么检查它,要么应用程序将退出。
新的使用适合这种设计。
如果您未能分配内存,则必须明确处理该错误。
没有机会忘记检查NULL指针。 因此,你不能通过意外地使用NULL指针来搞乱内存。
另外,在静态内存分配上,即在堆栈上,如果内存不足,是否会有异常?
不幸的是,你不能依赖这个。
它是实现定义了什么发生在堆栈溢出。 在很多系统中,甚至无法检测到导致内存损坏并可能最终导致崩溃的情况。
注意
如果你#include <new>,那么你可以使用一个新的no throw版本,当没有剩余内存的时候返回NULL。 除非有一些专门的需求,最好避免。
malloc
不能抛出异常,因为这会破坏与C兼容性new
抛出异常,因为这是在C ++中的首选方式的信号的错误。
据我所知,在早期版本的C ++中, new
的确在失败时返回0,
我认为一个重要的区别在于:
malloc
是分配内存的C方式; C中也没有例外 new
是C ++,面向对象和一切方式; 在C ++中也有例外,使用它们更加干净。
为什么要在C ++中保持malloc
? 我想这是因为C ++编译器也可以使用C代码...
......但是我经常听到(几年前,当我还在学校的时候,我从老师那里听到)在C ++中使用malloc
是不鼓励的,应该使用new
代替。
上一篇: Difference in implementation of malloc and new. Stack implementation?
下一篇: What is difference between instantiating an object using new vs. without