当从构造函数抛出未处理的异常时会发生什么

dac*_*ngy 9 c++ java memory-leaks

从构造函数抛出未处理的异常会发生什么?对于Java和C++?会有内存泄漏吗?

Che*_*Alf 7

你问,

"当从构造函数中抛出未处理的异常时会发生什么?对于Java和C++?会有内存泄漏吗?"

一个未处理的异常是不具有关联的处理程序异常.

在C++中,任何未处理的异常都会终止程序.在这种情况下,堆栈是否展开是未指定的,即根据编译器可以执行或不执行成功构造的局部变量的析构函数.抛出异常(例如在构造函数内部)是无关紧要的.

C++11§15.3/ 9:
"如果找不到匹配的处理程序,std::terminate() 则调用该函数; 在此调用之前是否展开堆栈std::terminate()是实现定义的."

Java中未处理的异常同样必然会终止程序,或者至少是当前线程,如果它不是主线程,但保证调用finally子句:

Java SE 7语言规范§11.3:
"如果找不到catch 可以处理异常的子句,则终止当前线程(遇到异常的线程).在终止之前,所有 finally条款都被执行[...]"

由于程序终止,实际上程序本身没有内存泄漏,因为在实践中操作系统在进程后清理.

但是,崩溃程序可能会在磁盘上留下临时文件,并且可能会泄漏服务器进程中的其他资源,包括这些服务器进程中的内存泄漏.


Thi*_*ilo 6

对于Java:控制流返回给调用者,就像从常规方法抛出异常一样.没有内存泄漏(半构造的实例将被丢弃并被垃圾收集)