C++ try/catch:OutputDebugStringW in catch 块输出两次



我有一个带有 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(...),是否可以?我是这么想的。

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

int a = global_b->num; // global_b is NULL
int b = global_b->someothernum; // global_b is NULL

通过 NULL 指针访问元素是未定义的行为。在此之后,您的程序可以自由地执行任何操作,因此您看到的任何内容都是有效的输出。

您依赖于特定于 Visual C++ 的行为,通过捕获访问 NULL 指针的异常。因此,这不是对此行为进行编码的好方法。测试 NULL 将是执行此操作的正确方法。另请参阅...如何捕获空指针异常?

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

最新更新