繁体   English   中英

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

[英]C++ try/catch: OutputDebugStringW in catch block outputs twice?

我有一个带有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上调用。 发生了什么? 不幸的是,我重新编译了代码,当我将其改回原来的方式以试图重现出现两次的异常消息时,我做不到。
这是在Visual Studio 2010 SP1中使用的DbgView 4.79。 有没有人看过使用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指针访问元素是未定义的行为。 在此之后,您的程序可以自由执行任何操作,因此您看到的都是有效的输出。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM