在记录错误设计时是否解压缩ptr?

时间:2012-12-05 10:06:25

标签: c++ c pointers logging

在浏览一些我没写过的旧代码时,我注意到了这样的事情(简化)

//switch case on a msg received from a queue,...
//... get_function returns msgtype and ptr
switch(msgtype)
//...
default:
{
    MYLOGGER<< "Unknown message" << (*ptr)->some_member_var <<"\r\n";
}

所以我想把它改成

        default:
{
    MYLOGGER<< "Unknown message...\r\n";
    MYLOGGER<< "..." << (*ptr)->some_member_var << "\r\n";
}

因为在ptr是垃圾的情况下我害怕在记录开始之前崩溃? 我在这个例子中是否适合?通常也应该避免在记录错误时进行解除引用。

编辑:关于MYLOGGER,它是一个以此结束的宏: 具有重载运算符的记录器类&lt;&lt;在dtror中执行ostream flush(),因此不需要endl。

4 个答案:

答案 0 :(得分:2)

如果当前代码崩溃,那么新代码也会崩溃。一个更好的解决方案是在解除引用之前简单地检查nullptr,如果是这种情况,则打印一条特殊的消息。

if(ptr == nullptr)
    MYLOGGER<<"invalid null message\r\n";;
else
    MYLOGGER<< "Unknown message " << (*ptr)->some_member_var <<"\r\n";

鉴于(根据您的评论)运营商&lt;&lt;已经执行了刷新,这是我们可以获得的安全,即使在崩溃的情况下(也许如果ptr无效,但不是nullptr),我们很可能会在我们的日志中看到“未知消息”。

答案 1 :(得分:2)

我会推荐Chris Lattner What every C programmer should know about undefined behavior(他比编译器编写者更好地谈论编译器的惊喜?)。

TL; DR版本是:当它未定义时,由于编译器优化,没有 temporal 安全性。因此,您提供的两个版本完全相同。

答案 2 :(得分:1)

如果您不知道消息是什么,则不应尝试以任何方式解释其内容。你可以记录ptr本身的值,但你真的不知道它指向的位置,所以不要尊重它。

答案 3 :(得分:0)

您的记录器可能异步工作,或者使日志异步持久,在这种情况下,第二个代码不会比第一个更有用。
无论如何,访问未经检查的指针是未定义的行为,在这种情况下,可能崩溃,因为收到未知消息似乎有点苛刻。