Касаются ли процедуры освобождения памяти освобождаемого блока? - PullRequest
5 голосов
/ 02 февраля 2009

Windows HeapFree, msvcrt free: они вызывают освобождение освобождаемой памяти? Я пытаюсь оценить, значительно ли ускорит завершение работы приложения отсутствие освобождения памяти при выходе.

ПРИМЕЧАНИЕ. Это очень специфический технический вопрос. Дело не в том, должны ли приложения вызывать или не вызывать free при выходе.

Ответы [ 3 ]

4 голосов
/ 02 февраля 2009

Если вы не освободите все свои ресурсы при завершении работы приложения, это сделает невозможным обнаружение каких-либо действительно серьезных проблем, таких как утечки памяти, - которые были бы большей проблемой, чем медленное отключение. Если пользовательский интерфейс быстро исчезает, пользователь будет думать, что он быстро отключился, даже если ему еще предстоит много работы. С пользовательским интерфейсом восприятие скорости важнее, чем фактическая скорость. Когда пользователь выбирает опцию «Выход из приложения», главное окно приложения должно немедленно исчезнуть. Не имеет значения, что если приложению потребуется несколько секунд, чтобы изящно освободить все, выход не заметит пользователь.

1 голос
/ 18 февраля 2010

Я провел тест на 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 внутри)

0 голосов
/ 02 февраля 2009

Я почти уверен, что ответ на вопрос об улучшении скорости будет "да". Освобождение блока может касаться или не затрагивать фактический рассматриваемый блок, но в любом случае ему, безусловно, придется обновить другую бухгалтерскую информацию. Если у вас выделено миллионы небольших объектов (это случается), то усилия, необходимые для их освобождения, могут оказать значительное влияние.

Если вы можете это организовать, вы можете попытаться настроить свое приложение так, чтобы, если оно знает, что оно выйдет из системы, сохранило любую ожидающую работу (конфигурацию, документы и т. Д.) И завершило работу некорректно.

...