C++ C++;try/catch:OutputDebugStringW在catch块中输出两次?

C++ C++;try/catch:OutputDebugStringW在catch块中输出两次?,c++,visual-studio-2010,visual-studio,visual-c++,debugview,C++,Visual Studio 2010,Visual Studio,Visual C++,Debugview,我有一个带有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(...) { O

我有一个带有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进程上调用该函数。发生了什么事?不幸的是,我重新编译了代码,当我将代码改回原样,试图重现出现两次的异常消息时,我做不到。
这是在VisualStudio2010SP1中使用的DBGView4.79。有人见过他们使用OutputDebugString输出两次的东西吗

编辑-感谢回答这个问题的人。答案指出我不能依赖于空指针异常。在VisualStudio中,我使用<代码> /EHA < /C>来将所有东西都当作C++异常来捕捉,这样如果有任何问题,我就包装了,我可以因为异常而中止。如果我使用
/EHa
期望访问冲突将传递给
catch(…)
,可以吗?我想是的。

它未定义的行为(任何事情都可能发生(而且似乎也会发生)):


通过空指针访问元素是未定义的行为。在这一点之后,程序可以自由地做任何事情,因此,无论你看到什么都是有效的输出。

< P>你通过捕捉一个异常来访问空指针来依赖VisualC++的特定行为。因此,这不是编写这种行为的好方法。测试NULL将是正确的方法。另见

为什么不检查NULL,然后自己抛出异常,看看这是否会改变什么,这可能有助于确定未定义的行为是否是导致此问题的原因,或者是否确实存在其他问题。

我将此视为DbgView中的一个小故障而不予考虑。@Hans ok。我想是的,但我希望能有人读到这篇文章来证实这一点。我从未在DbGVIEW中见过这样的东西。我用<代码> /EHA < /C> >编译我的DLL,以将所有异常都作为C++异常捕获。这是在VisualStudio中。VisualStudio中的定义行为不是吗?@测试:Windows定义了访问违规行为,微软C++链接Windows异常(SEH)和C++异常,但我认为它不能保证代码会产生访问违规。
int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL