メモリ割り当て解除ルーチンは解放されているブロックに触れますか?

StackOverflow https://stackoverflow.com/questions/502727

質問

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を使用すると、スピードの感覚は実際の速度よりも重要です。ユーザーが「アプリケーションの終了」オプションを選択すると、メインアプリケーションウィンドウはすぐに消えるはずです。アプリケーションは、出口が優雅に、ユーザーが気付かない場合、すべてを解放することの後に数秒かかる場合、それは問題ではありません。

私は、速度向上の質問に対する答えが「はい」になり、ほぼ確信しています。ブロックを解放することや質問に実際のブロックには手を触れないことかもしれないが、それは確かにどのような場合には他の管理情報を更新する必要があります。あなたが割り当てられた小さな物体(それが起こる)の無数を持っている場合は、それらすべてを解放するために必要な努力は大きな影響を与える可能性があります。

あなたがそれを手配することができた場合、あなたは終了するために起こっている知っている場合、不正に保留中の作業(設定、文書、何でも)を保存して終了するようにアプリケーションを設定してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top