0

以下のコードでは、Windows Server 2008 での実行時に fputs(...) がアサートをスローします。Vista または XP マシンではこの問題は発生しません。何が原因なのか途方に暮れていますか?

アサートは次のとおりです: Stream != NULL

ログファイルが作成されると、時々成功するように見えるので、ランダムでもあるようです。

誰でも助けることができますか?

void DLog::Log(const char *fmt, ...)
{
    va_list varptr;

    va_start(varptr, fmt);

    int n = ::_vscprintf(fmt, varptr);
    char *buf = new char[n + 1];
    ::vsprintf(buf, fmt, varptr);

    va_end(varptr);

    if (!m_filename.empty())
    {
        FILE *f = fopen(m_filename.c_str(), "at");
        if (f != NULL)
        {
            fputs(buf, f);
            fputs("\n", f);
            fclose(f);
        }
        else
            ::MessageBox(0,"Error at fputs in Log","Error",0);
    }


    delete [] buf;
}
4

1 に答える 1

1

fputs主張しているのは2番目ですか?vsprintfバッファの終わりをオーバーランしている可能性はありますか? フォーマット文字列と実際の可変引数が正しく一致しない場合があります。

あなたの質問は C++ とタグ付けされており、その言語でこれを行うには間違いなくより良い方法があります。

少なくとも、古い C APIstd::ofstreamの代わりに使用して記述を行うことを検討してください。FILE*しかし、varargs 関数を完全に忘れて、C++ 標準ストリームのような挿入演算子を使用することをお勧めします。次に、型の安全性を確保し、簡単に誤って渡された varargs パラメーターの必要性を取り除きます。

于 2010-07-16T15:47:41.047 に答える