我有一个带有try catch块的函数,如下所示:
bool apple()
{
OutputDebugStringW(L"entered apple");
try {
SomeObj orange;
int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL
}
catch(...) {
OutputDebugStringW(L"leaving apple due to exception");
return false;
}
OutputDebugStringW(L"leaving apple normally.");
return true;
}
在DbgView中的一次我看到了这个:
entered apple
leaving apple due to exception
leaving apple due to exception
在DllMain PROCESS_ATTACH上调用该函数。发生了什么?不幸的是,我重新编译了代码,当我将其更改回原来试图重现两次出现的异常消息时,我无法做到。
这是在使用DbgView 4.79的Visual Studio 2010 SP1中。有没有人见过他们使用OutputDebugString输出两次输出的东西?
修改 - 感谢那些回答此问题的人。答案指出我不能依赖NULL指针异常。在Visual Studio中,我使用/EHa
来捕获所有内容作为C ++异常,以便如果我正在包装的任何函数有任何问题,我可以因异常而中止。如果我使用/EHa
预期会将违规行为传递给catch(...)
,这样可以吗?我是这么认为的。
答案 0 :(得分:0)
它未定义的行为(任何事情都可能发生(似乎也是如此)):
int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL
通过NULL指针访问元素是未定义的行为。在此之后,您的程序可以自由地执行任何操作,因此无论您看到的是有效输出。
答案 1 :(得分:0)
通过捕获访问NULL指针的异常,您依赖于visual c ++特定的行为。所以这不是编码这种行为的好方法。测试NULL将是正确的方法。另见...... How to catch the null pointer exception?
答案 2 :(得分:0)
为什么不检查NULL,然后自己调试异常,看看是否有任何改变,可能有助于查看未定义的行为是否是导致这种情况的原因,或者是否确实存在其他问题。