7

複数のポインターが同じオブジェクトを指している場合、正常に削除できないと言われました (delete キーワードを使用)。代わりに、ポインターを NULL または 0 に設定する必要があると言われました。

私が持っているとすれば:

ClassA* object = new ClassA();
ClassA* pointer1 = object;
ClassA* pointer2 = object;

delete pointer1pointer2では、次のことを行う必要がありますか?

pointer1 = 0;
pointer2 = 0:

NULL に設定した後も、キーワードを使用する必要がありますdeleteか? それとも、0に設定するだけで十分ですか?

4

7 に答える 7

9

newあなたがオブジェクトを持っているときはいつでも、あなたはそれを必要とdeleteし、メモリを解放します

ClassA* object = new ClassA();

delete object; // Free's the memory you allocated.

ポインターをに設定するポイントは、無効なポインターの逆参照NULLを停止することです

object = NULL;

これは、逆参照を試みる前にテストを実行できるようにするためです。

if(object != NULL)
{
  object->SomeMethod(); // We can assume it's safe to use the pointer.
}

また、メモリを指すポインタからメモリを削除できることにも注意してください。

ClassA* object = new ClassA();
ClassA* pointer1 = object;
ClassA* pointer2 = object;

delete pointer1; 

object, pointer1, and pointer2現在、すべてが既に解放されているメモリを指しており、それらが再定義されない限り、すべてNULLに設定する必要があります。

于 2012-08-20T11:04:45.513 に答える
4

ルールは、電話した回数だけ電話しなければならないというものです。 したがって、メモリを 1 回だけ割り当てた場合は、メモリの割り当ても 1 回だけ解除する必要があります。 deletenew

この手動のメモリ管理を回避するために使用したほうがよい場合がありますshared_ptr。この場合、スマート ポインタ自体がメモリを指しているポインタがなくなるとメモリの割り当てが解除されます。

于 2012-08-20T11:04:52.493 に答える
2

オブジェクトを削除した後は、そのオブジェクトを使用しないようにする必要があります。それを指しているポインターがあるかどうかは問題ではありませんが、これらのポインターが現在無効であることを知っておく必要があります。それらを nullptr に設定することは、それらを使用したときに確実にクラッシュする方法にすぎません。無効なポインターを使用すると、クラッシュが発生する場合と発生しない場合がありますが、最終的には追跡が困難な不明瞭な問題が発生します。

ただし、オブジェクトを削除するときにオブジェクトへの「ライブ」ポインターがある場合は、コードに問題があることを示している可能性があります。通常、オブジェクトは誰も必要としなくなった時点で削除されます。つまり、そのオブジェクトへのポインタやその他の参照が存在してはなりません。もちろん、これは難しいルールではありません。

于 2012-08-20T11:05:11.323 に答える
1

いいえ。その後、それを削除して0に設定するか、スマートポインターを使用する必要があります

于 2012-08-20T11:03:35.170 に答える
1

delete他の方法で使用する必要があります。メモリリークがあります

于 2012-08-20T11:04:22.783 に答える
0

それはできませんdelete。しかし、そうすべきではありません。既に削除された oobject を削除すると、プログラムがクラッシュするためです。と表示されますglibc detected double free。したがって、次の場合のベストプラクティス

if(object){
   delete object;
   object = 0;
}

0またはに設定せずにNULL保護しないと、if二重に削除される可能性があります。

于 2012-08-20T11:05:29.943 に答える
0

コードは new でオブジェクトを作成します。オブジェクトを削除して破棄する必要があります。一度。オブジェクトへの他のポインターがあるという事実は重要ではなく、コードがそれらのポインターを 0 に設定するかどうかも重要ではありません (実行していないガベージ コレクターを使用している場合を除きます)。これらのポインターを 0 に設定することの唯一の利点は、プログラムがオブジェクトなしを意味するフラグとして 0 を使用する場合です。これは設計上の決定であり、それが適切かどうかは、ここに示されている情報からはわかりません。

于 2012-08-20T22:27:01.657 に答える