据我所知,如果出现未捕获的异常,C++ 会立即销毁局部变量,Java 释放引用并将其余部分留给垃圾收集器。
这是正确的吗? Java 和 C++ 在这个问题上到底有什么区别?换句话说,就堆栈展开问题而言,这两种语言中的哪一种被认为更好? :)
最佳答案
我会因此被喷,但是...
在堆栈展开方面,C++ 比 Java 更好——没有竞争。 C++ 对象析构函数一直向上返回堆栈,直到到达捕获点——在此过程中优雅地释放所有托管资源。
正如您所说,Java 将所有这些置于非确定性垃圾收集器的支配下(最坏的情况),或者由您在代码中乱扔垃圾的任何明确制作的 finally 块控制(因为 Java 不支持真正的 RAII) .也就是说,所有的资源管理代码都在每个类的客户手中,而不是在类设计者的手中。
也就是说,在 C++ 中,只有当您小心确保析构函数本身不会发出异常时,堆栈展开机制才能正常运行。一旦你有两个 Activity 异常,你的程序 abort()
就不会通过 go (当然也不会触发任何剩余的析构函数)。
关于堆栈展开问题上的 Java 和 C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2551466/