0

C++ の細かい点を理解できていないと思います。私のプログラムが何をするかのログを設定しstd::clogたいのですが、理論的には私が望むことをしているように見えますが、実際にはそうではありません。

次のようにすると、clog は期待どおりに動作し、「テスト 1」を画面に書き込み、「テスト 2」がファイルに表示されます。

int main ()
{
    clog << "Test 1" << endl;
    streambuf* original_buffer = clog.rdbuf (ofstream ("test.log").rdbuf ()));
    clog << "test 2" << endl;

    clog.rdbuf (original_buffer);
    return 0;
}

しかし、それをすべてクラスに入れると、「テスト 1」が画面に書き込まれ、test.log が作成されますが、内部には何もなく、「テスト 2」はどこにもありません!:

class IerrLog
{
    std::streambuf * original_buffer;
    public:
    IerrLog ()
    {
        std::ofstream logFile ("test.log");
        original_buffer = std::clog.rdbuf (logFile.rdbuf ());
    }
    ~IerrLog ()
    {
        std::clog.rdbuf (original_buffer);
    }
};

int main () {
    clog << "Test 1" << endl;
    IerrLog someLog ();
    clog << "Test 2" << endl;
    return 0;
}

私は何が欠けていますか?

編集:後者をvalgrindで実行すると、次のようなエラーが発生します(前者はクリーンに実行されます):

Invalid read of size 8
    at 0x39598993E5: std::ostream::flush() (in /usr/lib/libstdc++.so.6.0.10)
    by 0x395989B5F2: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib/libstdc++.so.6.0.10)
    by 0x400F8E: main (main.cc:23)
  Address 0x7ff0006c8 is just below the stack ptr.  To suppress, use: --workaround-gcc296-bugs=yes

私 (あまり一般的でないプログラマー) がこのような単純なプログラムでコンパイラのバグを見つけたと考えるほど不快ではありませんが、これは私をさらに混乱させ、valgrind は明らかに後者が何らかの形で間違っていることを発見します。それらは機能的に同一です。

4

1 に答える 1

4

IerrLogのスタック変数を作成したいとします。変更する必要があります

IerrLog someLog ();

IerrLog someLog;

元のステートメントは、引数を取らず IerrLog を返す関数someLog()の宣言としてコンパイラによって解釈されます。

また、スタック上ではなく、メンバー変数としてファイルを作成する必要があります。

于 2009-05-12T01:13:25.200 に答える