int main(int argc, char** argv)
{
try {
char *p2 = NULL;
cout << "p2:" << strlen(p2) <<endl;
cout << "mark";
}
catch (...) {
cout << "caught exception" <<endl;
}
return 0;
}
输出为p2:
,因此cout << "mark";
和cout << "caught exception" <<endl;
都没有运行,为什么?
答案 0 :(得分:6)
在C ++中,取消引用NULL指针会导致未定义的行为,这意味着任何事情都可能发生:计算机可能爆炸,函数可能返回任意值,程序可能被操作系统杀死异常(与C ++表达式不同,它不能被try-catch
捕获)。
简而言之,不要这样做。
如果您真的需要这样做是出于一个非常好的理由(比如解决库中的错误而无法控制),请查看操作系统对此类内容的支持(例如SEH on窗口)。
答案 1 :(得分:5)
在符合POSIX标准的系统上,您的程序会收到SIGSEGV信号,并在您致电strlen(p2)
后立即死亡,因为p2
为NULL
。< / p>
据我所知,没有办法使用C ++异常来移植segfaults。
答案 2 :(得分:3)
您的代码有未定义的行为。因此,任何输出或无输出都是有效结果。我的猜测是strlen
导致访问冲突(至少在x86上)并且您的程序正在终止。
在尝试取消引用空指针时,C ++不会抛出异常。
答案 3 :(得分:2)
strlen()
不会抛出异常,因为它是C函数而C没有异常。当你给它输入错误时,它只会崩溃你的程序。 (虽然不需要。)
答案 4 :(得分:0)
strlen(NULL)尝试取消引用NULL指针。这引发了硬件异常,无法通过try-catch机制捕获。节目爆炸了。如果您尝试将除以零执行,则会出现相同的情况。
因此,检查指针是否为(非)NULL总是一个好习惯。如果指针在某处不应该是NULL(并且您将其视为特殊情况),则可以从该位置抛出软件异常。你的catch块的主体会被执行如果你写了这样的东西(在strlen调用之前):
if(p2 == NULL)
throw 1;
你忘了添加打印“mark”的endl操纵器。它应该是:
cout << "mark" << endl;