5

Windows HeapFree、msvcrt free: 解放されるメモリがページインされますか? 終了時にメモリを解放しないと、アプリケーションのシャットダウンが大幅に高速化されるかどうかを推定しようとしています。

注: これは非常に具体的な技術的な質問です。アプリケーションが終了時に呼び出す必要があるかどうかではありませんfree

4

3 に答える 3

4

アプリケーションのシャットダウン時にすべてのリソースの割り当てをきれいに解除しないと、本当に深刻な問題 (メモリ リークなど) があるかどうかを検出することがほぼ不可能になります。UI がすぐに消えてしまうと、まだやるべきことがたくさんあるにもかかわらず、ユーザーは UI がすぐにシャットダウンしたと思うでしょう。UI では、速度の知覚は実際の速度よりも重要です。ユーザーが [アプリケーションを終了] オプションを選択すると、メイン アプリケーション ウィンドウがすぐに消えます。その後、アプリケーションがすべてを解放して正常に終了するまでに数秒かかるかどうかは関係ありません。ユーザーは気付かないでしょう。

于 2009-02-02T10:34:43.513 に答える
1

のテストを実行しましたHeapFreeHeapFree次のプログラムは、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

于 2010-02-18T06:47:17.320 に答える
0

速度向上の質問に対する答えは「はい」であるとほぼ確信しています。ブロックを解放すると、問題の実際のブロックに触れる場合と触れない場合がありますが、いずれにせよ他の簿記情報を更新する必要があります。無数の小さなオブジェクトが割り当てられている場合 (実際に発生します)、それらすべてを解放するために必要な労力は、大きな影響を与える可能性があります。

調整できる場合は、アプリケーションが終了することがわかっている場合は、保留中の作業 (構成、ドキュメントなど) を保存して、不当に終了するようにアプリケーションを設定してみてください。

于 2009-02-02T10:17:01.630 に答える