ほとんどのオペレーティングシステムとほとんどのコンパイラバージョンでは、プログラムが起動するときに、new
と他の動的割り当てで使用するために、ある程度のメモリが確保されています。メモリマネージャの実装は、何らかの方法でメモリを分割し、要求を容易に処理できるようにいくつかのデータ構造を設定します。メモリを要求すると、要求を保持するのに十分な大きさのブロックがある場合、メモリマネージャはそのブロックを返します。何かを割り当て解除すると、プールに戻して将来の考慮に備えます。
ご要望があり、使用可能なスペースがない場合、メモリマネージャーが使用できる戦略がいくつかあります。いくつかのシステムでは、非常に大きな割り当ての場合、メモリマネージャはmmap
を使用し、OSにメモリブロックを返すようにします。他の人は、sbrk
のようなシステムコールを使用して、より多くのメモリをOSから取得し、既存のメモリと同じように切り分けます。
プログラムでメモリがリークした場合、プログラムのメモリマネージャはそのメモリをリサイクルしません。プログラムが実行されている限り、プログラムは使用できなくなります。あなたのプログラムがそのメモリをもう一度必要としないなら、これは完全にうまくいっています - 以前に割り付け解除されたブロックをリサイクルすることができます - しかし、より多くのメモリが必要な場合は、より多くのスペースをOSに要求します。
すべての最新のオペレーティングシステムは、プロセスが終了するとプロセスによって割り当てられたすべてのメモリを自動的に再利用するため、割り当てられたすべてのメモリが解放されるとすぐに解放されます。残酷で珍しいオペレーティングシステムを除いて、大量のメモリをリークさせるプログラムは、他のプログラムがそのメモリを使用することを永久に阻止することはありません。心に留めておくべき
何かが、あなたのプログラムの中で作業しているすべてのメモリが仮想メモリとない物理メモリであるということです。各プログラムはすべてのシステムメモリを完全に使用していると考えていますが、実際にはOSは常にメモリを再配置したり、必要に応じてディスクにページングしたりします。その意味では、たとえあなたのプログラムがシステム上のすべてのメモリをOSに要求したとしても、他のプログラムも実行されないようにすることはできません。それはプロセスが狂っていると思うメモリページを出し入れし続けます。
割り当て済みで再割り当てされたとはどういう意味ですか?それをコードに入れることはできますか?一般的に、見かけ上割り振られていないメモリにあるデータを検索する機会はかなり高いです。 – MikeMB
引数のために、新しいもの、設定された長さ、ポインタを使用して割り当てられ、同じサイズで同じポインタに再割り当てされたとします。 – bigcodeszzer
私は現在のコンピュータにC++を持っていないか、コードを提供しています。 – bigcodeszzer