C++ stderrr上的fflush导致程序崩溃

C++ stderrr上的fflush导致程序崩溃,c++,windows,windows-phone-8,stderr,fflush,C++,Windows,Windows Phone 8,Stderr,Fflush,我正在将stderr重定向到Windows Phone运行时上的日志文件: int stdError = 0; FILE* pLogFile = NULL; // Redirect stderror to a logfile if ( ! m_logFilePath.empty( ) ) { // Get a duplicate file descriptor for stderror // This returns -1 on failure stdError = :

我正在将
stderr
重定向到Windows Phone运行时上的日志文件:

int stdError = 0;
FILE* pLogFile = NULL;

// Redirect stderror to a logfile
if ( ! m_logFilePath.empty( ) )
{
    // Get a duplicate file descriptor for stderror
    // This returns -1 on failure
    stdError = ::_dup( ::_fileno( stderr ) );

    if ( stdError != -1 )
    {
        // Redirect stderror to a log file so we can capture
        // ffmpeg error information
        // Ignore the return value (nothing we can do if this fails)
        ::freopen_s( &pLogFile, m_logFilePath.c_str( ), "w", stderr );
    }
}

调用
fflush(stderr)时,程序间歇性崩溃。当我不重定向stderr时,一切似乎都很正常。

是windows,谁知道呢

尝试
std::cerr.flush()因为我完全可以看到windows再次做他们自己的事情(比如套接字不像文件,他们喜欢做他们自己的IO事情)

使用我刚才所说的,将任务放到他们的标准库中,而不是假设它是一个文件之类的。记住“抽象”,flush是一个方法,它是一个动词,我们不关心如何(或者在本例中不想知道),所以让我们假设flush做flush应该做的事情

如果这不起作用,请留下评论,我会考虑一下

我不使用windows或windows手机(我不是世界上24个幸运儿中的一员:p),但我知道windows上存在I/O问题(“差异”),幸运的是MinGW和co对我隐瞒了这些问题:)

改变你的策略,如果我真的想避开这个问题(因为它不是你的代码),创建一个名为my_error_stream的新类,它扩展了std::ostream(这样你可以像std::cerr一样使用它,它“是”std::ostream)

在名为get_error_stream()的函数中放入一个静态方法,或返回从my_error_stream派生的两个类中的一个,一个直接转发到std::err,另一个转发到文件

这取决于您希望代码的外观和感觉,我这样说是因为它将实现保持独立,并在类层次结构的“分支”下


它并没有真正回答您的问题,但您的代码似乎很好,而且Windows在管道和套接字方面很糟糕

“stdError”变量的用途是什么?你好像在这里漏FD。