新しいキーワードのデバッグによるCのオーバーフロー

c++ debugging pointers
新しいキーワードのデバッグによるCのオーバーフロー

私は、cがどのようにメモリを管理しているのか理解していなかったために、デバッグが難しい問題を抱えています。 コードは投稿するには長すぎますが、基本的な設定は次のとおりです。

global_var = 0;
int main() {
  for(i = 0; i < N; ++i) {
    ClassA a;
    new ClassB(a); // seems to be problem!
  }
}

一部の `+ N `では、 ` global_var `が破損します(0ではなくなりました)。 ClassAまたはClassBのコンストラクタには、 ` global_var +`を台無しにするものは何もありません。

`+ new ClassB(a)`を ` ClassB b(a)`に置き換えると、問題を解決できるようですが、これでは目的の処理を行えません( ` boost

ptr_vector `を`+新しいClassB(a)`インスタンス)。

何がうまくいかない可能性がありますかについての任意のアイデア?

*更新:*私は本当に次のようなことをしています。

global_var = 0;
int main() {
  boost::ptr_vector myobjects;
  for(i = 0; i < N; ++i) {
    ClassA a;
    myobjects.push_back(new ClassB(a)); // seems to be problem!
  }
}

どちらも問題を引き起こします。 しかし、これはなぜ問題なのでしょうか。 たくさんのオブジェクトをキューに入れるために何か他のことをするべきですか? コマンドパターンの基礎として、「+ myobjects +」を使用しています。

更新

`classB ‘は以下のようになります。

class ClassB {
public:
  ClassB() {}
  ClassB(ClassA a) : a_(a) {}
private:
  ClassA a_;
}

ClassAも(実生活では)単なるリストの初期化です。

問題?

更新 global_varは実際には複雑な行列型であり、メモリの割り当て方法に問題があるかもしれないという事実と関係があるかもしれません。

  0  0


ベストアンサー

Cのメモリはデフォルトでは自動的に解放されません。 結果として

新しいクラスB(a)。 //問題だそうです!

ヒープ上に作成されています。 メモリのアドレスは何も割り当てられていません。 したがって、手動で削除することはできません。

クラスB * b =新しいクラスB(a)。 // Bを作成し、アドレスを返し、//そのアドレスをbに格納する。 bを削除します。 //アドレス "b"のメモリを削除

メモリの削除に失敗すると、プログラム内の他のメモリ領域にヒープがオーバーフローし、グローバル変数が上書きされる可能性があります。 これは、削除されない限り、newの結果を変数に代入しなくても発生する可能性があります。

2


classAにはコピーコンストラクタがありますか? もしそうなら、それはどのように見えますか? そうでない場合は、class Aにコピーコンストラクタを作成し、それが問題を解決するかどうかを確認します。

それ以外は、デバッガでコードを実行して、そのグローバルがいつ変更されたかを特定できるかどうかを確認してください。

1


これはおそらくglobal_varのメモリを上書きしているか、最終的には上書きされる原因となる他のメモリを破壊している2つのコンストラクタ(ClassAまたはClassB)のうちの1つのバグです。

0


クラスAのコピーコンストラクタに何か問題があると思います。

0


global_varにデータ書き込みブレークポイントを設定して、どこに書き込まれているかを調べることができます。

MSVCデバッガで、 ‘for’行にブレークポイントを設定します。 表示されたら、[デバッグ]メニューから[新しいブレークポイント – >新しいデータブレークポイント…​]を選択し、 持続する。 次に変数が書き込まれるときにデバッガは中断します。

gdbでもこれを実行できますが、構文を忘れてしまいました。

0


徹底的な調査の結果、この動作はglobal_varの基本クラスのバグによるものであることが判明しました。 グローバルおよび静的メモリ割り当てが行われていた方法に微妙なバグがありました。

0


タイトルとURLをコピーしました