문제

Windows Heepfree, MSVCRT Free : 메모리가 해제되는 원인이 되나요? 출구에서 메모리를 해제하지 않으면 응용 프로그램 종료 속도를 크게 높일 수 있습니다.

참고 : 이것은 매우 구체적인 기술적 질문입니다. 응용 프로그램이 전화를 해야하는지 여부에 관한 것이 아닙니다. free 출구에서.

도움이 되었습니까?

해결책 2

나는 시험을했다 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 내부)

다른 팁

애플리케이션 종료시 모든 리소스를 깨끗하게 처리하지 않으면 메모리 누출과 같은 심각한 문제가있는 경우 느리게 종료하는 것보다 문제가되는 경우 감지 할 수 없습니다. UI가 빨리 사라지면 사용자는 여전히 많은 작업이 있어도 빠르게 종료되었다고 생각합니다. UI를 사용하면 속도에 대한 인식이 실제 속도보다 중요합니다. 사용자가 '응용 프로그램 종료'옵션을 선택하면 기본 응용 프로그램 창이 즉시 사라져야합니다. 응용 프로그램이 모든 것을 종료하는 데 몇 초가 걸린 후에는 문제가되지 않습니다.

속도 개선 질문에 대한 답은 "예"일 것입니다. 블록을 해제하면 문제의 실제 블록을 터치하지 않을 수도 있지만 어쨌든 다른 부기 정보를 업데이트해야합니다. 수십억 개의 작은 물체가 할당 된 경우 (발생),이를 자유롭게하는 데 필요한 노력이 중대한 영향을 줄 수 있습니다.

당신이 그것을 준비 할 수 있다면, 당신은 그것이 종료 될 것이라는 것을 알고 있다면, 보류중인 작업 (구성, 문서 등)을 저장하고 무의식적으로 종료하도록 응용 프로그램을 설정하려고 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top