7

と言っdelete pointerpointer = nullptr同じですか?おそらくそうではありませんが、後者はメモリを解放しますか? delete pointer; pointer = nullptr/はどうpointer = nullptr; delete pointerですか?通常は別の機会に削除され、通常の削除でエラーが発生する場合に、必要に応じて途中でポインターを削除する安全な方法を作成するためにそれを使用しないのはなぜですか?

4

5 に答える 5

9

ポインタをnullに設定している間、ポインタが指す内容はまだスペースを占有しているため、同じではありません。

やっている

delete pointer;
pointer = NULL;

いいけど、

pointer = NULL;
delete pointer;

そうではありません。すでにポインターを NULL に設定しているため、deleteコマンドには削除するものがありません (またはそう思われます)。ポインターが以前に指していたもの (リンクされたリストとしましょう) がメモリのどこかに浮かんでいて、プログラムによって追跡できないため、メモリ リークが発生しています。

于 2015-07-24T20:12:05.157 に答える
3

と言っdelete pointerpointer = nullptr同じですか?おそらくそうではありませんが、後者はメモリを解放しますか?

delete式はデストラクタを呼び出し、メモリの割り当てを解除します (つまり、メモリをフリーストアに戻します)。null ポインターへのポインターを設定すると、これらのいずれも実行されず、オブジェクトへのポインターが他にない場合、メモリまたはリソースがリークする可能性があります。

delete pointer; pointer = nullptr/はどうですかpointer = nullptr; delete pointer?

既に null になっているポインターを削除しても、効果はありません。したがって、前者はオブジェクトを破棄し、メモリの割り当てを解除してからポインターを null に設定しますが、後者は削除が効果がないため、依然としてリークします。

ポインタを削除した後に null に設定することを推奨する人もいます。これにより、バグのために再度削除された場合に、プログラムがクラッシュしなくなります。個人的にはこれはお勧めしません。ポインターを 2 回削除するのは、2 回目には効果がなくてもバグだと思います。プログラムがクラッシュした場合は、そのバグを見つけて修正できるとよいと思います

通常は別の機会に削除され、通常の削除でエラーが発生する場合に、必要に応じて途中でポインターを削除する安全な方法を作成するためにそれを使用しないのはなぜですか?

よく分からない...

于 2015-07-24T20:15:46.397 に答える
2

ポインタを削除すると、ポインタが指すメモリが解放されます。ポインタを に設定するだけnullptrでは、ポインタが指していたメモリを削除する方法がないため、メモリ リークが発生します。

nullptrポインターを後で設定することはできdeleteますが、ポインターが現在何も指していないことを示しておりdelete、誤って再度呼び出した場合、それは非操作であり、プログラムは引き続き実行されます。

于 2015-07-24T20:14:58.210 に答える
0

delete は、オブジェクトに割り当てられたメモリを解放するためだけでなく、オブジェクトのデストラクタを呼び出すためにも呼び出されます。

デストラクタが呼び出されない場合でも、オブジェクトはリソースを保持します。

もちろん、基本型にはデストラクタがなく、delete を呼び出すと、基本型のオブジェクトが占有しているメモリのみが解放されます。

ただし、一般に、ユーザー定義型のオブジェクトは、削除時にデストラクタを呼び出す必要があります。

そして、ポインターはオブジェクトを指すものとします。したがって、この一連のステートメントには意味がありません

pointer = nullptr; delete pointer;

nullptrオブジェクトの有効なアドレスではないためです。NULL ポインタ リテラルです。

于 2015-07-24T20:21:50.633 に答える