我认为我无法理解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”就没有找到了!:< / p>
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显然发现后者在某种程度上是错误的,即使我试图让它们在功能上完全相同。
答案 0 :(得分:4)
我假设您要创建 IerrLog 的堆栈变量。你需要改变
IerrLog someLog ();
到
IerrLog someLog;
您的原始语句将被编译器解释为函数声明 someLog(),它不带参数并返回IerrLog。
您还应该将文件创建为成员变量而不是堆栈。