1

次のコードがあるとします。

//...
class A
//...
A* myA = new A();
A* myPointerToMyA = myA;
delete myA;
delete myPointerToMyA; // this is wrong, no?
//...

最後の行は、その上の行とまったく同じことをしますね。だから私は今delete、無効/NULL ポインターを ing しているでしょうか?

これがばかげた質問かもしれないことは理解していますが、それでも、安心が必要です。

4

6 に答える 6

5

確かにそれは間違っています。そして、他のコメントの1つとは対照的に、それはnewで割り当てなかったからではありません.

myA と myPointerToMyA はどちらも同じものを指しています。それらのいずれかを介して削除することは問題ありません-しかし、それらは同じものを指しているため、合法的に削除できるのは1回だけです-削除されるのは、ポインター自体ではなく、指されているものです。

同じものへのポインタが 2 つあることに問題はありませんが、誰がそれを所有しており、誰がそれを削除する責任があるかを追跡する必要があります。

この場合、削除されたオブジェクトへのポインターを削除すると、動作は「未定義」になります。ランタイムは好きなことを実行できます。(気に入らないことはほぼ保証できます...)

于 2010-06-30T16:44:06.680 に答える
5

はい、違います。を使用した場合delete、ポインターは削除されません。むしろ、それが指すものを削除しています。したがって、delete onポインタを使用すると、そのポインタが指すメモリが解放されます。そのメモリを指している他のポインタはすべて未割り当てメモリを指しており、ダングリング ポインタです。ダングリング ポインターを使用すると、未定義の動作が発生します。すでに解放されているメモリを解放しようとすることは確かに有効ではないためdelete、ダングリング ポインターを使用することは間違いなく間違っています。セグメンテーション違反が発生する可能性があります。

于 2010-06-30T16:44:54.483 に答える
1

ここで得られるものは次のとおりです。

A* myA = new A();          // myA is now equal to 0x11110000 for example(!)
A* myPointerToMyA = myA;   // myPointerToMyA is now equal to 0x11110000
delete myA;                // equal to delete (A*)(0x11110000)
delete myPointerToMyA;     // equal to delete (A*)(0x11110000)

最後の 2 行は、結局同じです。このコードは、未定義の動作につながります。

于 2010-06-30T16:42:25.857 に答える
1

あなたは正しいです。

では、無効/NULL ポインターを削除することになりますか?

技術的には、何も設定されていないため、無効NULLです。ポインタでも構いdeleteNULLません。

于 2010-06-30T16:37:17.133 に答える
0

はい、違います。new A()で割り当てられ、で解放されるために割り当てられたメモリdelete myA。注意すべきことの 1 つは、 は無効なポインタを削除しようとする試みですが、は と等しくないdelete myPointerToMyAため、NULL ポインタを削除しようとする試みではないということです。myPointerToMyANULL

于 2010-06-30T16:37:07.013 に答える
0

2 つのポインターが同じオブジェクトを指しています。delete myA;初めて呼び出した後、オブジェクトは破棄されます。2 回目に delete( ) を呼び出すと、delete myPointerToMyA;オブジェクトを複数回削除しようとしており、そのようなアクションの結果は未定義です (通常、実行時例外が発生します)。

于 2010-06-30T16:48:27.720 に答える