1

C++ アプリケーションの実行中に非常にイライラする問題が発生しました。Windows XP の Interix サブシステムで pgcpp コンパイラを使用しています。私の問題は基本的にここで説明されています:

ヘッダー ファイルにクラス定義があります。このヘッダー ファイルは、1 つのソース ファイルに含まれています。このクラスには 2 つのコンストラクターがあり、基本的にロガーの実装に使用されます。最初のコンストラクターは引数として ostream *out を取り、2 番目のオーバーロードされたコンストラクターはファイル名とデフォルトのブール値 false を取ります。この 2 番目のコンストラクターの目的は、渡すファイル名のストリームを取得し、メッセージのログ記録を開始することです。コンストラクタ内のコードは次のとおりです。

MessageLogger::MessageLogger(std::ostream *out): p_out (out), p_ofstream (0)  
{  
    if (p_out)  
    {  
        (*p_out) << "Started logging messages" << endl;  
    }  
}  

MessageLogger::MessageLogger (char const *filename, bool append_to_file) : p_out (0),   p_ofstream (0)  
{  
    if (append_to_file)  
    {  
    p_ofstream = new std::ofstream (filename, ios::app);  
    }  
    else  
    {  
        p_ofstream = new std::ofstream (filename);  
    }  

    p_out = p_ofstream;  

    if (p_out)  
    {  
        (*p_out) << "Started logging messages" << endl;  
    }  
}  

p_out と p_ofstream の宣言は次のとおりです。

std::ostream *p_out;
std::ofstream *p_ofstream;
unsigned int p_indent_level;

上記の 3 つはすべてプライベート メンバーです。MessageLogger クラスのインスタンス化は次のように行われます。

MessageLogger logger ("filename");

append_to_file のデフォルト値は false であることに注意してください。PGDBG挙動不審でもあります。p_ofstream = new std::ofstream (filename);コントロールが にあり、ランダムな場所にステップインしてアプリケーションがクラッシュしたときに、不可解にステップインでき ます。

また、PGDBG で混合コードまたは逆アセンブリ コードのいずれかを表示しようとすると、デバッガーがクラッシュして次のメッセージが表示されます。

jpgdbg parse: Newline must follow cmd in 'eleq "0" struct MessageLogger *Mes
sageLogger::MessageLogger(struct basic_ostream *out); (TranslatorGeneric.cpp
)
'
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5
jpgdbg parse: Newline must follow cmd in 'eleq "1" struct MessageLogger *Mes
sageLogger::MessageLogger(char *filename, unsigned char append_to_file); (Tr
anslatorGeneric.cpp)
'
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5

上記とまったく同じことを行ったサンプル プログラムでこれを再現することはできませんが、すべて正常に動作します。誰かが何が起こっているのか、これに修正があるかどうかを説明できますか?

ありがとう、アディティア。

4

1 に答える 1

-1

動的に割り当てられた ofstream のインスタンスを使用しているのはなぜですか? 次のようなことをしてみませんか...

class Logger
{
  public:
    Logger(ostream& str) : _str(str.rdbuf()) // use the buffer from the stream
    {
      _str << "writing to passed in buffer" << endl;
    }
    Logger(const char* fname, bool append = false) : _str(cout.rdbuf())
    {
      _file.open(fname, (append)? ios::out|ios::app : ios::out);
      if (_file.is_open())
        _str.rdbuf(&_file); // redirects to file, else remains on cout

      _str << "expected to be logging to: " << fname << endl;
    }

    // use as needed

  private:
    filebuf _file;
    ostream _str;
};

このようにして、ファイルが失敗した場合でも、ログ出力が引き続き出力されます...

問題に戻りますが、HW_NEW は何をしますか? あなたが提供した基本的な情報で本当に言うのはちょっと難しいです...

于 2010-11-18T12:57:29.320 に答える