2009-05-12 2 views
0

私はC++のいくつかの細かい点を理解していないと思います。私は私のプログラムが何をしているかのログを設定したいと思っていて、私が理論的にしたいと思っているように見えるstd::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 

IはI(卑しい共通プログラマ)が見つけたことを考えるのに十分な不快ではありませんよこのような単純なプログラムのコンパイラのバグですが、これは私をさらに混乱させ、valgrindは明らかに、後者が何らかの形で間違っていることを明らかにします。

答えて

4

のスタック変数を作成したいとします。IerrLog。あなたは引数を取らず、IerrLogを返す関数someLog()の宣言として、コンパイラによって解釈されます

IerrLog someLog; 

あなたの元の文に

IerrLog someLog(); 

を変更する必要があります。

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

+0

すごく速かった。 'logFile'がスタック上にあることは確かに問題でした! – MighMoS

+0

それほどではありません - 最初の行は、引数をとらずにIerrLogを返す関数someLog()の宣言として解釈されます。 –

+0

@ドリューあなたは正しいです、私は答えを修正します。 – lothar

関連する問題