これは初心者の質問ですが、c#でプログラミングを学び、c ++に移行しました。ポインターを操作しているので、ポインターを使い終わったら、プログラムを閉じたときに、ポインターをメモリから解放する必要があることを知っています。それらはメモリから削除されますか、それともそこにとどまりますか?
3 に答える
プログラムが終了すると、使用したすべてのメモリ (動的に割り当てられたかどうかにかかわらず) がオペレーティング システムに返されます。それが C プログラム、C++ プログラム、C# プログラム、またはその他の種類のプログラムであるかどうかは問題ではありません。
さて、OS がメモリを再利用するからといって、メモリ管理について無頓着になれるわけではありません。プログラムの実行中は、使い終わったメモリを解放するように注意する必要があります。そうしないと「メモリリーク」が発生し、少なくともプログラムの実行中は、プログラムとそれが実行されているシステムに確実に影響を与える可能性があります。
解放が必要なのはポインターではなく、指定されたオブジェクトであることに注意してください。
答えは、ポインタが指すメモリのタイプによって異なります。
- ポインターが自動オブジェクトを指している場合、オブジェクトは暗黙的に消去されます。
new
またはnew []
またはmalloc
またはを使用して動的に割り当てられたオブジェクトをポインタが指している場合は、またはまたはcalloc
を呼び出して明示的に割り当てを解除する必要があります。delete
delete []
free
動的割り当ては慎重に使用することをお勧めします。必要な場合は、生のポインターの代わりにスマート ポインターを使用してください。
編集:
あなたの質問が次の場合:
プログラムがメモリの割り当てを解除せずに終了するとどうなりますか?
答えは:
OS がそれを回収します。OSは、プログラムがメモリをリークしたかどうかを理解していないプロセスに割り当てられたすべてのメモリを単純に取り戻します。
ただし、自分の混乱を自分でクリーンアップすることは常に良い習慣です。
デストラクタに副作用のあるコードがあるクラスがある場合delete
、動的に割り当てられたポインタを呼び出さないと、未定義の動作が発生し、コンパイラの慈悲でコードが完全にぶら下がります。
あなたによって割り当てられたメモリ (たとえば New キーワードを使用して) は、削除しない限りそこに残ります! ポインター自体について話している場合は、そうです。プログラムの最後に、ポインターは完全に消去されます。