0

デバッグが難しいクラスがあります。好奇心は、ローカル変数として使用するとうまく動作しますが、グローバル変数として使用すると、プログラムの終了時にエラーが発生することです。

例えば:

A a;
int main(){
  dosomething(a);
}

bad_allocプログラムの終了時に例外を発生させます。

その間

int main(){
  A a;
  dosomething(a);
}

うまくいきます。

これがどのような状況で起こり得るかを知ることで、クラスの問題の根底に到達できることを願っています. 私は多くのコンテキストでクラスを試しましたが、症状は常に同じです。グローバル変数には常に問題がありますが、ローカル変数は常にうまく機能します。

注 1flush : クラスには、内部バッファーをディスクに書き込み、シェル コマンドを実行してそのファイルを処理する(非仮想) メンバー関数を呼び出すデストラクターがあります。

~A(){this->flush();}

注2:デバッグ(およびコードの簡素化)を続けながら、MWEを投稿しようとします。現時点では、これが正確に発生する可能性がある典型的なケースを知っておくと、デバッグに役立ちます。

4

1 に答える 1

0

C++ は、グローバル オブジェクトの構築順序も破棄順序も定義しません。この結果、相互に何らかの形で依存する 2 つ (またはそれ以上) のグローバル オブジェクトがある場合 (この場合、A はバッファーとシェルの実行に依存します)、依存オブジェクトは、実行が開始されたときに既に破棄されている可能性があります。その依存オブジェクトを使用するデストラクタ。

「手動で」正しい破棄順序を保証する必要があります。最も簡単な方法は、オブジェクトをスタック (作業例が示すように) またはヒープに割り当て、メインから戻る (または exit などを呼び出す) 前に delete を使用して破棄することです。

于 2013-05-10T23:18:36.880 に答える