2016-11-24 8 views
0

ダイナミックメモリ割り当てに関して、C++コンパイラがどのようにハードウェアとやり取りするのかと思います。CPPダイナミックメモリリカバリ

たとえば、C++実行可能ファイルがOSからメモリを要求すると、そのアクセスはどのくらい直接ですか?

ダイナミックメモリを割り当てて手動で割り当てを変更した場合でも、後で失われたデータを回復することはできますか?おそらく、OSの記録や、コンパイラによって一度だけ解釈されたメモリの割り当ての結果として、

動的に割り当てられたデータを回復することは可能ですか?

+0

割り当て済みで再割り当てされたとはどういう意味ですか?それをコードに入れることはできますか?一般的に、見かけ上割り振られていないメモリにあるデータを検索する機会はかなり高いです。 – MikeMB

+0

引数のために、新しいもの、設定された長さ、ポインタを使用して割り当てられ、同じサイズで同じポインタに再割り当てされたとします。 – bigcodeszzer

+0

私は現在のコンピュータにC++を持っていないか、コードを提供しています。 – bigcodeszzer

答えて

1

ほとんどのオペレーティングシステムとほとんどのコンパイラバージョンでは、プログラムが起動するときに、newと他の動的割り当てで使用するために、ある程度のメモリが確保されています。メモリマネージャの実装は、何らかの方法でメモリを分割し、要求を容易に処理できるようにいくつかのデータ構造を設定します。メモリを要求すると、要求を保持するのに十分な大きさのブロックがある場合、メモリマネージャはそのブロックを返します。何かを割り当て解除すると、プールに戻して将来の考慮に備えます。

ご要望があり、使用可能なスペースがない場合、メモリマネージャーが使用できる戦略がいくつかあります。いくつかのシステムでは、非常に大きな割り当ての場合、メモリマネージャはmmapを使用し、OSにメモリブロックを返すようにします。他の人は、sbrkのようなシステムコールを使用して、より多くのメモリをOSから取得し、既存のメモリと同じように切り分けます。

プログラムでメモリがリークした場合、プログラムのメモリマネージャはそのメモリをリサイクルしません。プログラムが実行されている限り、プログラムは使用できなくなります。あなたのプログラムがそのメモリをもう一度必要としないなら、これは完全にうまくいっています - 以前に割り付け解除されたブロックをリサイクルすることができます - しかし、より多くのメモリが必要な場合は、より多くのスペースをOSに要求します。

すべての最新のオペレーティングシステムは、プロセスが終了するとプロセスによって割り当てられたすべてのメモリを自動的に再利用するため、割り当てられたすべてのメモリが解放されるとすぐに解放されます。残酷で珍しいオペレーティングシステムを除いて、大量のメモリをリークさせるプログラムは、他のプログラムがそのメモリを使用することを永久に阻止することはありません。心に留めておくべき

何かが、あなたのプログラムの中で作業しているすべてのメモリが仮想メモリとない物理メモリであるということです。各プログラムはすべてのシステムメモリを完全に使用していると考えていますが、実際にはOSは常にメモリを再配置したり、必要に応じてディスクにページングしたりします。その意味では、たとえあなたのプログラムがシステム上のすべてのメモリをOSに要求したとしても、他のプログラムも実行されないようにすることはできません。それはプロセスが狂っていると思うメモリページを出し入れし続けます。

+0

を参照してください。 OSが要求されたとおりに正確にメモリブロックを与えるように強制する方法はありますか?もしそうなら、それは実行されなければならない私はアセンブリですか? – bigcodeszzer

+0

または、より適切には、OSがもはやその時点で関与していないと想像しているように、ハードウェアにアクセスを許可するようにしてください。 – bigcodeszzer

+0

マシンにあるRAMチップに/ exact/addressesを割り当てたいとしたら、 – bigcodeszzer