簡體   English   中英

為什么將wcout / wcerr重定向到/ dev / null會導致程序崩潰?

[英]Why does redirecting wcout/wcerr to /dev/null cause program to crash?

考慮我的伐木班

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();
    }
}

現在,如果我將Tracing設置為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") StopOutput() 實際上,您甚至不需要/ dev / null,只需使用wcout.rdbuf(NULL) ,它也應該可以更快地工作。

要立即寫入文件,請調用flush或使用std :: flush操作器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM