try {
int i = 0;
int j = 0/i; /* Division by 0 */
int *k = 0;
std::cout << *k << std::endl; /* De-reference invalid memory location. */
}
catch (...) {
std::cout << "Opps!" << std::endl;
}
无法检测到上述运行时错误。或者,我对C ++异常处理功能有错误的期望吗?
答案 0 :(得分:7)
如果取消引用不指向对象的指针,则不会出现异常,您将获得未定义的行为。任何事情都可能发生。
通常,如果取消引用空指针,就像在示例中一样,程序将崩溃。
答案 1 :(得分:3)
/ EHa是神奇的编译器开关,使Visual Studio将SEH异常视为C ++异常。然后你可以“捕获”访问冲突并除以零例外。
通常不建议这样做。
答案 2 :(得分:2)
当你运行这个程序时(至少在我的系统上我运行它时),你不会抛出C ++异常;你实际上是对标准C库进行分类。库中的分段错误不是C ++异常,因此C ++运行时无需捕获。
将此程序与C#或Java中的等效程序进行对比,区别在于它们各自的运行时将处理这些错误运行时异常,并且不会对任何外部库进行分段错误。
答案 3 :(得分:1)
这些不是C ++异常。这些是操作系统异常。如果您使用的是Windows,则可以启用异步异常模型(/ EHa标志)并捕获Win32异常。
答案 4 :(得分:0)
C ++给你的运行时环境非常薄。在大多数情况下,它会执行您为其编程的操作,并且不会执行您不编程的操作。您可以为指针编写一个包装器,当您取消引用空指针时将对其进行检查。实际上,boost::shared_ptr<>
在取消引用它时会断言不等于null,因此您可以获得与本机指针类似的性能,同时提供您在调试时所需的额外信息。