Windows HeapFree、msvcrt free: 解放されるメモリがページインされますか? 終了時にメモリを解放しないと、アプリケーションのシャットダウンが大幅に高速化されるかどうかを推定しようとしています。
注: これは非常に具体的な技術的な質問です。アプリケーションが終了時に呼び出す必要があるかどうかではありませんfree
。
Windows HeapFree、msvcrt free: 解放されるメモリがページインされますか? 終了時にメモリを解放しないと、アプリケーションのシャットダウンが大幅に高速化されるかどうかを推定しようとしています。
注: これは非常に具体的な技術的な質問です。アプリケーションが終了時に呼び出す必要があるかどうかではありませんfree
。
アプリケーションのシャットダウン時にすべてのリソースの割り当てをきれいに解除しないと、本当に深刻な問題 (メモリ リークなど) があるかどうかを検出することがほぼ不可能になります。UI がすぐに消えてしまうと、まだやるべきことがたくさんあるにもかかわらず、ユーザーは UI がすぐにシャットダウンしたと思うでしょう。UI では、速度の知覚は実際の速度よりも重要です。ユーザーが [アプリケーションを終了] オプションを選択すると、メイン アプリケーション ウィンドウがすぐに消えます。その後、アプリケーションがすべてを解放して正常に終了するまでに数秒かかるかどうかは関係ありません。ユーザーは気付かないでしょう。
のテストを実行しましたHeapFree
。HeapFree
次のプログラムは、i=31999で内部にアクセス違反があります。
#include <windows.h>
int main() {
HANDLE heap = GetProcessHeap();
void * bufs[64000];
// populate heap
for (unsigned i = 0; i < _countof(bufs); ++i) {
bufs[i] = HeapAlloc(heap, 0, 4000);
}
// protect a block in the "middle"
DWORD dwOldProtect;
VirtualProtect(
bufs[_countof(bufs) / 2], 4000, PAGE_NOACCESS,
&dwOldProtect);
// free blocks
for (unsigned i = 0; i < _countof(bufs); ++i) {
HeapFree(heap, 0, bufs[i]);
}
}
スタックは
ntdll.dll!_RtlpCoalesceFreeBlocks@16() + 0x12b9 bytes
ntdll.dll!_RtlFreeHeap@12() + 0x91f bytes
shutfree.exe!main() Line 19 C++
したがって、答えは「はい」のように見えます(これは内部free
で使用されるため、これも当てはまります)HeapFree
速度向上の質問に対する答えは「はい」であるとほぼ確信しています。ブロックを解放すると、問題の実際のブロックに触れる場合と触れない場合がありますが、いずれにせよ他の簿記情報を更新する必要があります。無数の小さなオブジェクトが割り当てられている場合 (実際に発生します)、それらすべてを解放するために必要な労力は、大きな影響を与える可能性があります。
調整できる場合は、アプリケーションが終了することがわかっている場合は、保留中の作業 (構成、ドキュメントなど) を保存して、不当に終了するようにアプリケーションを設定してみてください。