gpt4 book ai didi

c++ - 为什么我换的木屐不粘?

转载 作者:行者123 更新时间:2023-11-27 23:35:17 26 4
gpt4 key购买 nike

我想我没能理解 C++ 的一些更精妙的地方。我想为我的程序做的事情设置一个日志,并发现了 std::clog,这在理论上似乎可以做我想做的事情,但实际上并没有。

如果我执行以下操作,clog 会按预期工作并将“测试 1”写入屏幕,而“测试 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;
}

但如果我将所有这些都放入一个类中,那么“测试 1”将写入屏幕,创建 test.log,但里面什么也没有,“测试 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 显然发现后者在某种程度上是错误的,即使我试图使它们在功能上完全相同。

最佳答案

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

IerrLog someLog ();

IerrLog someLog;

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

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

关于c++ - 为什么我换的木屐不粘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/850724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com