0

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

4

3 回答 3

0

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

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

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

于 2012-09-30T18:43:21.510 回答
0

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

于 2012-09-30T19:52:27.420 回答
0

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

于 2012-09-30T19:00:12.200 回答