2

私はクラスポインタ宣言を持っています:

MyClass* a;

破壊方法には次のものがあります。

    if (a)
    {
        delete a;
        a= NULL;
    }

ポインター a を削除するときに問題が発生しました。

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

問題の原因は何ですか?どうすれば解決できますか?

4

6 に答える 6

4

あなたの現在の宣言で:

MyClass* a;

aランダムな値を取得します。後で有効な値を指定しないと、次のようになります。

a = new MyClass();

メモリ内の不明な場所を指し、おそらくプログラム用に予約されたメモリ領域ではないため、削除しようとするとエラーが発生します。

この問題を回避する最も簡単な方法は、a宣言時に値を指定することです。

MyClass* a = new MyClass();

または、宣言時に値を指定できない場合 (まだ知らない可能性があります)、null に割り当てます。

MyClass* a = 0;

ところで、if (a)コードからテスト ( ) を削除できます。deleteNULL ポインターではノーオペレーションです。

于 2012-05-23T15:20:50.893 に答える
2

この後に何かへのポインタを初期化していない限り:

MyClass* a;

ポインターaはランダムな値を保持します。だからあなたのテスト

if (a) { }

合格し、ランダムなメモリ位置を削除しようとします。

これは、ポインターを初期化することで回避できます。

MyClass* a = 0;

その他のオプションは、指しているオブジェクトが別の場所で削除されていて、ポインターが に設定されていない0か、スタックに割り当てられているオブジェクトを指しているということです。

他の場所で指摘されているように、そもそもベア ポインターではなくスマート ポインターを使用することで、この問題をすべて回避できます。std::unique_ptrをご覧になることをお勧めします。

于 2012-05-23T15:16:59.017 に答える
2

スマート ポインターを使用してメモリを解放します。deleteアプリケーションコードでは常に間違っています。

于 2012-05-23T15:18:31.923 に答える
1

使用する必要があります

MyClass* a = NULL;

あなたの宣言で。をインスタンス化しない場合、ポインタは未定義のメモリ領域を指しています。含まれているクラスのデストラクタが実行されると、deleteそのランダムな場所に移動しようとします。

于 2012-05-23T15:16:43.510 に答える
1

aを指すメモリをどのように割り当てましたか? new[]( の配列を作成するために) を使用した場合MyClassは、 で割り当てを解除する必要がありますdelete[] a;。で割り当てた場合malloc()(クラスを操作する場合、これはおそらく悪い考えです)、 で割り当てを解除する必要がありますfree()

でメモリを割り当てた場合はnew、おそらく別の場所でメモリ管理エラーを起こしている可能性がありますa。Valgrind を使用してメモリの問題をデバッグしてみてください。

于 2012-05-23T15:15:09.913 に答える
1

その場合MyClass* a;、メモリを割り当てずにポインターを宣言します。初期化せず、a必ずしも NULL ではありません。したがって、それを削除しようとすると、テストif (a)は成功しますが、割り当て解除は失敗します。C++11 を使用できる場合は、実行MyClass* a = NULL;する必要があります。MyClass* a(nullptr);(ここではnew、ポインターを宣言するだけだと言っているので、この場合はどこにも使用しないと仮定します。)

于 2012-05-23T15:21:42.587 に答える