当构造函数中抛出未处理的异常时,会发生什么?对于Java和C++,会发生什么?是否会有内存泄漏?
finally
子句:final
块是否被处理。之后我添加了标准和规范引用,解决了这个问题。所以在你的情况下,似乎至少有一个明确的声明使得你认为现在的内容与“dunno dunno dunno”相同。我认为这意味着在SO上,我需要优先考虑不将内容的感知引导到毫无价值的方向,而不是将技术问题的感知引导到过早的结论。 :-) - Cheers and hth. - Alf对于Java语言: 控制流程会像在常规方法中抛出异常一样返回给调用者。不存在内存泄漏(未完成的实例将被丢弃并进行垃圾回收)。
是否出现内存泄漏取决于代码编写方式。如果编写“好”的代码,就不应该出现内存泄漏。但是完全有可能出现情况,使得一切变得非常糟糕。
如果构造函数在构造过程中分配了任何内容,则可能会出现问题。
解决方案通常是使用所谓的“两阶段构建”,因此构造函数本身非常简单且“不会出错”。一旦对象构造完成,您调用一个成员函数以以可能失败的方式填充对象,然后可以随意抛出异常,并确保在某个时候运行析构函数,所有事情都应该顺利进行。请注意“部分构造对象在析构函数中”的问题-如果指针为NULL或其他某些东西在析构函数的中途没有被构造,会发生什么。
[以上内容受“在返回主函数之前有处理程序,并且我们确实想做一些其他事情而不是终止整个程序”的影响]。
在C++或Java中,情况相似但又不同。
当异常被抛出时,它会向上回溯堆栈,寻找处理程序。在C++或Java中,可能永远找不到处理程序,因此一直回溯到起点并终止程序。在Java中,有一个叫做已检查异常的概念,它强制要求对异常进行某种处理(如果已检查)。在C++中,有一个叫做异常规范的概念,但它是不切实际的(设计不良),不应该使用,因此,在C++中将所有异常视为“未经检查”的。
无论异常最终终止程序还是在抛出异常的地方的上游某处被捕获,导致这种情况的展开过程才是重要的。如果最终终止程序,那么当操作系统回收内存时,就不会有内存泄漏。你需要担心的是:
finally
块中释放。finally
块在展开期间保证被执行,但是,当然,它们必须包含释放在相应的try
块中分配的资源的代码。只要程序员做好了他的工作,资源就不会泄漏。在两种情况下,你必须清理地释放你的资源(无异常抛出)。