【问题标题】:Why doesn't my change to clog stick?为什么我的堵塞物不粘住?
【发布时间】:2010-10-25 10:38:20
【问题描述】:

我想我没能理解 C++ 的一些细节。我想为我的程序所做的事情设置一个日志,并发现了std::clog,这在理论上似乎符合我的要求,但实际上并没有。

如果我执行以下操作,clog 会按预期工作并将“Test 1”写入屏幕,“Test 2”会显示在文件中:

int main ()
{
    clog << "Test 1" << endl;
    streambuf* original_buffer = clog.rdbuf (ofstream ("test.log").rdbuf ()));
    clog << "test 2" << endl;

    clog.rdbuf (original_buffer);
    return 0;
}

但是如果我把所有这些都放到一个类中,那么“Test 1”会被写入屏幕,test.log 会被创建,但里面什么都没有,“Test 2”也找不到!:

class IerrLog
{
    std::streambuf * original_buffer;
    public:
    IerrLog ()
    {
        std::ofstream logFile ("test.log");
        original_buffer = std::clog.rdbuf (logFile.rdbuf ());
    }
    ~IerrLog ()
    {
        std::clog.rdbuf (original_buffer);
    }
};

int main () {
    clog << "Test 1" << endl;
    IerrLog someLog ();
    clog << "Test 2" << endl;
    return 0;
}

我错过了什么?

编辑:如果我在 valgrind 中运行后者,我会收到这样的错误(前者运行干净):

Invalid read of size 8
    at 0x39598993E5: std::ostream::flush() (in /usr/lib/libstdc++.so.6.0.10)
    by 0x395989B5F2: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib/libstdc++.so.6.0.10)
    by 0x400F8E: main (main.cc:23)
  Address 0x7ff0006c8 is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes

我并不讨厌认为我(一个普通的程序员)在这么简单的程序中发现了一个编译器错误,但这让我更加困惑,valgrind 显然发现后者在某种程度上是错误的,即使我试图使它们在功能上相同。

【问题讨论】:

    标签: c++ clog


    【解决方案1】:

    我假设你想创建一个 IerrLog 的堆栈变量。你需要改变

    IerrLog someLog ();
    

    IerrLog someLog;
    

    编译器会将您的原始语句解释为函数 someLog() 的声明,该函数不接受任何参数并返回 IerrLog。

    您还应该将文件创建为成员变量,而不是在堆栈中。

    【讨论】:

    • 哇,真快。 logFile 在堆栈上确实是问题所在!
    • 不完全——第一行被解释为函数 someLog() 的声明,它不带参数并返回 IerrLog。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多