gpt4 book ai didi

c++ - 为什么将 wcout/wcerr 重定向到/dev/null 会导致程序崩溃?

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

考虑我的日志类

void LogWriter::InitLogWriter(void)
{
wcout.flush();
wcerr.flush();
COUT_BACKUP = wcout.rdbuf(); // save original cout buffer
CERR_BACKUP = wcerr.rdbuf(); //save original cerr buffer
FileStreamOpen = false;
switch(m_nTraceLvl)
{
case OffLevel:
StopOutput();
break;
case ErrorLevel:
OutputErrorsToFile(s_TraceFile);
break;
case DetailLevel:
OutputAllToFile(s_TraceFile);
break;
default:
StopOutput();
break;
}
wcout << "Initialize Log Writer" << endl;
}
void LogWriter::OutputAllToFile(TCHAR* fileName)
{
wstreambuf* fb = GetFileBufferStream(fileName);

wcout.rdbuf(fb); // push wcout buffer to file
wcerr.rdbuf(fb); // push cerr buffer to file

FileStreamOpen = true;
}
void LogWriter::OutputErrorsToFile(TCHAR* fileName)
{
wstreambuf* fb = GetFileBufferStream(fileName);
wcerr.rdbuf(fb);
FileStreamOpen = true;
wofstream fout("/dev/null");
wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'
}
void LogWriter::StopOutput(void)
{
wofstream fout("/dev/null");

wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'
wcerr.rdbuf(fout.rdbuf()); // redirect cerr to fout
}
wstreambuf* LogWriter::GetFileBufferStream(TCHAR* fileName)
{
filestr.open(fileName);
return filestr.rdbuf(); // get file's streambuf
}
void LogWriter::Dispose()
{
wcout << "Kill Log Writer" << endl;
wcout.rdbuf(COUT_BACKUP); // restore the original stream buffer
wcerr.rdbuf(CERR_BACKUP);

if(FileStreamOpen)
{
filestr.close();
}
}

现在,如果我将我的追踪设置为 DetailLevel (2),一切都很好。我所有的日志记录都转到文件中。但是,如果我选择 OffLevel 或 ErrorLevel,我的程序就会崩溃。我的调试器没有打开,所以我添加了 cout << "."在每一行上(我讨厌这样做,但它有效)并且它指向我

wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'

作为我的罪魁祸首...我先转向重定向 wcout,然后重定向 wcerr 并且它起作用了(但尚未调用 wcerr)

所以这是我的问题?我应该先处理 wcout 吗?我先尝试冲洗..那没有用..所以我不知道。我做错了什么?

另外还有一个好处.. 为什么我的所有输出在我关闭我的 LogWriter 之前都没有进入文件? IE LogWriter::Dispose()

最佳答案

您崩溃是因为 wofstream fout("/dev/null"); 是在堆栈上创建的,并在您退出该函数后立即销毁。

像对待文件一样对待“/dev/null”。也就是说,在 StopOutput() 中调用 OutputErrorsToFile("/dev/null")。事实上,您甚至不需要/dev/null,只需使用 wcout.rdbuf(NULL),应该也能更快地工作。

要立即写入文件,请调用 flush 或使用 std::flush 操纵器。

关于c++ - 为什么将 wcout/wcerr 重定向到/dev/null 会导致程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347413/

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