Касаются ли процедуры освобождения памяти освобождаемого блока?

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

Вопрос

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

ПРИМЕЧАНИЕ:Это очень специфический технический вопрос.Дело не в том, должны или не должны приложения вызывать 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 внутренне)

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top