C++ では、次のようにヒープに新しい変数を作成すると:
int* a = new int;
次のように delete を使用して、メモリを再利用するように C++ に指示できます。
delete a;
しかし、あなたのプログラムが閉じるとき、new で割り当てられたメモリは自動的に解放されますか?
C++ では、次のようにヒープに新しい変数を作成すると:
int* a = new int;
次のように delete を使用して、メモリを再利用するように C++ に指示できます。
delete a;
しかし、あなたのプログラムが閉じるとき、new で割り当てられたメモリは自動的に解放されますか?
deleteはい、自動的に再利用されますが、ヒープを広範囲に使用し、どこにも呼び出さない巨大なプログラムを作成しようとすると、ヒープ メモリがすぐに不足し、プログラムがクラッシュします。
したがって、上記の変数が不要になったらすぐに、メモリを慎重に管理し、動的に割り当てられたデータをdeletefor every new(またはdelete []を使用している場合) で解放する必要があります。new []
プロセスが終了すると、メモリは OS によって回収されます。もちろん、この引数は、プログラムによる適切なメモリ管理を実行しないために使用されるべきではありません。
人々に「はい」と言わせないでください。C++ には OS の概念がないため、「はい、OS がそれをクリーンアップします」と言うのは、もはや C++ についてではなく、あなたのものではないかもしれないいくつかの環境で実行されている C++ について話しています。
つまり、何かを動的に割り当てても解放しない場合は、リークが発生しています。delete/を呼び出すと、その寿命を終えることができますdelete[]。一部の OS (およびほぼすべてのデスクトップ OS) では、メモリが再利用されます (そのため、他のプログラムが使用する可能性があります)。しかし、メモリはリソースと同じではありません! OS は、必要なすべてのメモリを解放できます。ソケット接続を閉じる必要がある場合や、書き込みを終了するファイルがある場合などは、OS が解放しない可能性があります。リソースが漏れないようにすることが重要です。解放していないメモリを再利用することさえせず、プラットフォームがリセットされるまでリークが発生する組み込みプラットフォームがあると聞いたことがあります。
生のものを動的に割り当てるのではなく (明示的に削除する必要があることを意味します)、それらを自動的に割り当てられた (スタックに割り当てられた) コンテナーにラップします。そうしないことは悪い習慣と見なされ、コードが非常に厄介になります。
だから使わないnew T[N]で、使ってstd::vector<T> v(N);ください。後者は、リソース リークを発生させません。使わないnew T;で、使ってくださいsmart_ptr p(new T);。スマート ポインターはオブジェクトを追跡し、使用されなくなったことがわかると削除します。これは、Scope-bound Resource Management (SBRM、別名 Resource-Acquisition is Initialization、または RAII とも呼ばれます) と呼ばれます。
単一の " " がないことに注意してくださいsmart_ptr。どれが最適かを選択する必要があります。現在の標準にはstd::auto_ptrが含まれていますが、かなり扱いにくいです。(標準コンテナーでは使用できません。) 最善の策は、Boost のスマート ポインター部分を使用するか、コンパイラーがサポートしている場合は TR1 を使用することです。次にshared_ptr、間違いなく最も便利なスマート ポインターを取得しますが、他にも多くのスマート ポインターがあります。
動的に割り当てられたメモリへのすべてのポインタが破棄されるオブジェクト (つまり、動的に割り当てられた別のオブジェクトではない) にあり、そのオブジェクトがメモリを解放することを知っている場合、そのポインタは解放されることが保証されます。リークする立場に立つべきではないため、この質問は問題にならないはずです。
いいえ、それを解放するのはあなたの責任です。また、aポインタでなければならないので、次のようにする必要があります。
int *a = new int;
delete a;
Brian R. Bondy によるこの優れた回答では、によって割り当てられたメモリを解放することをお勧めする理由が詳しく説明されていaます。
デストラクタに実行したいコードが含まれている場合があるため、delete を明示的に呼び出すことが重要です。ログファイルにデータを書き込むようなものです。OS にメモリを解放させると、デストラクタ内のコードは実行されません。
ほとんどのオペレーティング システムは、プログラムの終了時にメモリの割り当てを解除します。ただし、自分で割り当てを解除することをお勧めします。上で述べたように、OS はデストラクタを呼び出しません。
一般的に delete の呼び出しに関しては、はい、常に delete を呼び出す必要があります。そうしないと、プログラムでメモリ リークが発生し、新しい割り当てが失敗する可能性があります。
いいえ、プログラムが終了 (「終了」) すると、動的に割り当てられたメモリはそのまま残ります
編集:
他の回答を読んで、私はより正確でなければなりません。動的に割り当てられたオブジェクトのデストラクタは実行されませんが、適切な OS によってメモリが再利用されます。
PS: 最初の行は次のようになります。
int* a = new int;
プロセスが終了すると、OS はプロセスが使用していたすべてのリソース (メモリを含む) の制御を取り戻します。ただし、もちろん、それによって C++ のデストラクタが必ずしも実行されるわけではないため、上記のリソースを明示的に解放しないことは万能薬ではありません (intもちろん、noop dtor を使用するまたは他のタイプの問題にはなりませんが;-) .