Stack Unwinding问题上的Java和C++

Fey*_*yaz 11 c++ java stack-unwinding

据我所知,在未捕获异常的情况下,C++会立即销毁局部变量,Java会释放引用并将其余部分留给垃圾收集器.

这是正确的吗?Java和C++在这个问题上究竟有什么区别?换句话说,就堆栈展开问题而言,这两种语言中的哪一种被认为更好?:)

Dre*_*all 10

我会为此受到抨击,但......

在堆栈展开前,C++比Java更好 - 没有竞争.C++对象析构函数一直触发堆栈直到达到捕获点 - 沿途释放所有托管资源.

正如你所说的那样,Java将所有这些都置于非确定性垃圾收集器(最坏的情况)或者任何明确制作的最终块的手中,你已经散布了你的代码(因为Java不支持真正的RAII) .也就是说,所有资源管理代码都掌握在每个类的客户手中,而不是应该在类设计者手中.

也就是说,在C++中,如果您小心确保析构函数本身不会发出异常,则堆栈展开机制只能正常运行.一旦你有两个活动的例外,你的程序abort()没有通过去(当然也没有解雇任何剩余的析构函数).

  • @Mnementh:在C++中你只需要有纪律:堆分配由智能指针,句点保存.内存管理问题结束.对不起,我不是故意咆哮Java,但有时候我觉得他们通过删除C++的所有优点来创建"更好的C++". (3认同)
  • @Drew Hall:智能指针的自我限制?为什么要删除C++的优点?;-) (2认同)

sha*_*oth 5

堆栈展开专门调用调用链上的所有完全构造的对象的析构函数,直到捕获到异常的点.

Java根本没有堆栈展开 - 如果抛出异常,它对对象不做任何事情.你必须自己处理对象catchfinally阻止它们.这主要是为什么C#引入了using语句 - 它们简化了调用IDisposable.Dispose(),但这又不是C++堆栈展开的完全替代.