首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当未处理的异常从构造函数抛出时会发生什么

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

Stack Overflow用户
提问于 2012-12-21 09:14:38
回答 8查看 3.1K关注 0票数 9

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

EN

回答 8

Stack Overflow用户

发布于 2012-12-21 09:47:59

你会问,

“当构造函数抛出未处理的异常时会发生什么?对于Java,对于C++?会不会有内存泄漏?“

在C++中,任何未处理的异常都会终止程序。未指定在这种情况下是否展开堆栈,即是否执行成功构造的局部变量的析构函数取决于编译器。异常从哪里抛出(比如在构造函数中)是无关紧要的。

如果找不到匹配的处理程序,则调用函数std::terminate();无论在此std::terminate()调用之前是否展开堆栈都是由实现定义的。

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

Java 7语言规范§11.3

“如果找不到可以处理异常的catch子句,则终止当前线程(遇到异常的线程)。

由于程序终止,因此实际上程序本身不会发生内存泄漏,因为实际上操作系统会在一个进程之后进行清理。

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

票数 7
EN

Stack Overflow用户

发布于 2012-12-21 09:17:25

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

票数 6
EN

Stack Overflow用户

发布于 2012-12-21 09:19:56

好吧,至少在C++中,一个未处理的异常会一直持续下去,直到它到达你的main(),从而关闭你的程序。未释放的内存将由操作系统处理。

不确定这是否回答了你的问题...?

所以,基本上,它就像是从其他函数抛出的一样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13982985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档