当构造函数抛出未处理的异常时会发生什么?对于Java,对于C++?会不会有内存泄漏?
发布于 2012-12-21 09:47:59
你会问,
“当构造函数抛出未处理的异常时会发生什么?对于Java,对于C++?会不会有内存泄漏?“
在C++中,任何未处理的异常都会终止程序。未指定在这种情况下是否展开堆栈,即是否执行成功构造的局部变量的析构函数取决于编译器。异常从哪里抛出(比如在构造函数中)是无关紧要的。
如果找不到匹配的处理程序,则调用函数std::terminate();无论在此std::terminate()调用之前是否展开堆栈都是由实现定义的。
Java中未处理的异常同样必须终止程序,或者至少终止当前线程(如果它不是主线程),但要保证调用finally子句:
Java 7语言规范§11.3:
“如果找不到可以处理异常的catch子句,则终止当前线程(遇到异常的线程)。
由于程序终止,因此实际上程序本身不会发生内存泄漏,因为实际上操作系统会在一个进程之后进行清理。
但是,崩溃的程序可能会在磁盘上留下临时文件,并且可能会泄漏服务器进程的其他资源,包括这些服务器进程中的内存泄漏。
发布于 2012-12-21 09:17:25
对于Java:控制流返回给调用者,就像从常规方法抛出异常一样。没有内存泄漏(构造了一半的实例将被丢弃并被垃圾回收)
发布于 2012-12-21 09:19:56
好吧,至少在C++中,一个未处理的异常会一直持续下去,直到它到达你的main(),从而关闭你的程序。未释放的内存将由操作系统处理。
不确定这是否回答了你的问题...?
所以,基本上,它就像是从其他函数抛出的一样。
https://stackoverflow.com/questions/13982985
复制相似问题