メモリ割り当て解除ルーチンは解放されているブロックに触れますか?
-
20-08-2019 - |
質問
WindowsのHeapFree、MSVCRTフリー:彼らはメモリーがページング-にするために解放され引き起こしていますか?私は出口で解放していないメモリが大幅にアプリケーションのシャットダウンを高速化するかどう推定しようとしています。
注:これは非常に特定の技術的な質問です。これは、アプリケーションがまたは出口でfree
を呼び出すべきではありませんする必要があるかどうかについてではありません。
解決 2
私はHeapFree
のためのテストを実行しました。次のプログラムは、I = 31999でHeapFree
内部アクセス違反があります:
#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
に適用されます)
他のヒント
それを検出することは不可能で、それが近付いようになります。 UIはすぐに消えた場合、ユーザーはそれが行うには、まだ多くの仕事を持っている場合でも、すぐにシャットダウンしていると思います。 UIを使用すると、スピードの感覚は実際の速度よりも重要です。ユーザーが「アプリケーションの終了」オプションを選択すると、メインアプリケーションウィンドウはすぐに消えるはずです。アプリケーションは、出口が優雅に、ユーザーが気付かない場合、すべてを解放することの後に数秒かかる場合、それは問題ではありません。
私は、速度向上の質問に対する答えが「はい」になり、ほぼ確信しています。ブロックを解放することや質問に実際のブロックには手を触れないことかもしれないが、それは確かにどのような場合には他の管理情報を更新する必要があります。あなたが割り当てられた小さな物体(それが起こる)の無数を持っている場合は、それらすべてを解放するために必要な努力は大きな影響を与える可能性があります。
あなたがそれを手配することができた場合、あなたは終了するために起こっている知っている場合、不正に保留中の作業(設定、文書、何でも)を保存して終了するようにアプリケーションを設定してみてください。