-1

この質問は主に c/c++ に関連しているため、c/c++ に前置きします。c/c++ で最も大きな影響があることがわかりました。

これはしばらくの間私を悩ませていました、そして私はこの問題のいくつかは回避できることを理解しています(回避する方法についての講義は避けたいと思いますが、それが起こった場合に備えて余波に焦点を当てたいと思います).根本的な質問があります。

最初の考え:

ポインターは、単にメモリ内の別の場所にあるオブジェクトへのアドレスとして機能します (これは、そのタイプのモノの数を変更する必要があるためint[]、またはモノの性質がモノの寿命を通じて変化する可能性があるためですpolymophism) 。

newキーワードが使用されるときはいつでも、対応するキーワードが必要deleteです (例外処理に応じて複数ではない場合、および複数の出口点)。

動的に割り当てられたメモリ チャンクがキーワードによって処理さdeleteれると、デストラクタが呼び出され (およびそのアクションがあれば実行されます)、メモリ チャンクはシステム ストアに返され、他の処理に使用できるようになります。また、(コンパイラ、マクロ、またはプログラマ)NULL不正なメモリ アクセスを避けるために、ポインタが に設定されます。

状況:

動的メモリ ( pointersnew、およびの組み合わせdelete) を使用するプログラムを作成している場合。何かが発生し、プログラムが予期せず終了した場合 (未処理の例外、メモリ アクセス エラー、不正な操作など)。システムは、プログラムが使用しているすべてのメモリを削除してシステムに戻そうとする必要がありますが、ポインタは常にクリアされるとは限りません。これは、オペレーティング システムとコンパイラ (プログラムの終了の実行方法) によって異なる場合がありますが、削除されたのはポインタであり、指されたものではないため、指されたものはメモリ内にまだ存在する可能性があります。確かに、これは非常に小さな損失になる可能性があります (小さなプログラムの場合は 1 MB 未満ですが、たとえば、データ ストアのストレス テストや大きなファイルの処理の場合、これは GB の範囲でも非常に大きくなる可能性があります。

直接的な質問は、その記憶を取り戻すためにどのような手順を実行できるかということです。私が見つけた唯一のことは、システムを再起動することです(これは、Windowsシステムでg ++とVS2008/2010を使用している場合です)

4

2 に答える 2

4

プログラムが終了すると、使用していたすべてのメモリがシステムに返されます。少なくとも、あなたが使用していると言うWindowsの下では。これが起こっていないと思われる場合は、プログラムが実際にはまったく終了していない可能性があります。

于 2012-04-27T05:58:25.237 に答える
1

ヒープはアロケーターにバインドされ、アロケーターはプロセスにバインドされます。プロセスが終了すると、ヒープは元に戻されます。システム共有リソースのみが割り当て解除されません。

于 2012-04-27T05:58:57.510 に答える