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

C++ 为什么将wcout/wcerr重定向到/dev/null会导致程序崩溃?,c++,redirect,wofstream,C++,Redirect,Wofstream,以我的日志类为例 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_n

以我的日志类为例

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();
    }
}
作为我的罪魁祸首。。。我首先改变了重定向wcout的方式,并重定向了wcerr,结果成功了(但wcerr还没有被调用)

这就是我的问题?我应该先出去吗?我先冲了一下,但没用。。所以我不知道。我做错了什么


也作为奖金。。为什么在我关闭LogWriter之前,我所有的输出都不会进入文件?IE LogWriter::Dispose()

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

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


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

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

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


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

我只需在底部使用定义更明确的功能即可。C流,甚至是特定于系统的代码。对伐木工人来说,可靠是很重要的。我想这可能会有所帮助……但我很惊讶,我不知道你的意思。我是一个java/C语言的家伙,被加入了C++程序。我遇到的一个问题是输出大字节数组(大约192字节),它会崩溃。当我切换到这个问题时,我没有额外问题——std::fstream是缓冲的,所以它会在感觉合适的时候写入,除非您通过“我的所有日志调用都有endl(我在stdafx.h中使用名称空间std)”刷新它所以这对我来说也没什么意义。但是我会试试std::flush的东西。我定义了一个tout wcout,我只会在底部使用更多定义良好的功能。C流,甚至是系统特定的代码。对于日志记录者来说,可靠是很重要的。我想这可能会有帮助…但我很惊讶,我不知道你的意思。我是一个java/C的家伙,而且有p在这个C++程序中,我遇到的一个问题是输出大字节数组(大约192字节),它会崩溃。当我切换到这个问题时,我不会有这个问题,因为这个额外的问题——STD::FSt流是缓冲的,所以它会在它感觉时被写入,除非你刷新它:“我的所有日志调用都有EnDL(我在STDAFX.H中使用命名空间STD)。所以这对我来说也没什么意义。。但我会试试这玩意儿。。先生,我把你介绍给你了。。使我高兴的是:)你,先生。。让我开心的一天:)
wcout.rdbuf(fout.rdbuf()); // redirect 'cout' to a 'fout'