2009-02-02 11 views
5

Windows HeapFree, msvcrt free: czy powodują zwolnienie pamięci do przywołania? Próbuję oszacować, czy nie zwolnienie pamięci przy wyjściu znacznie przyspieszyłoby wyłączenie aplikacji.Czy procedury deallocation pamięci dotykają uwolnionego bloku?

UWAGA: To bardzo szczegółowe pytanie techniczne. Nie chodzi o to, czy aplikacje powinny lub nie powinny dzwonić pod numer free przy wyjściu.

+0

Bardzo interesujące pytanie. Mam nadzieję, że ktoś może na nie odpowiedzieć. BTW, czy próbowałeś pytać na forach MSDN? –

+0

Myślę, że powinnaś opublikować zmianę jako odpowiedź. Świetna robota! –

Odpowiedz

1

Przeprowadziłem test dla HeapFree. Poniższy program ma dostęp naruszenie wewnątrz HeapFree przy 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]); 
    } 
} 

Stos jest

[email protected]() + 0x12b9 bytes 
[email protected]() + 0x91f bytes 
shutfree.exe!main() Line 19 C++ 

Więc wygląda na to, że odpowiedź brzmi „Tak” (dotyczy to free jak dobrze, ponieważ używa wewnętrznie HeapFree)

0

Jestem niemal pewien, że odpowiedź na pytanie o poprawę szybkości będzie "tak". Zwolnienie bloku może, ale nie musi dotknąć właściwego bloku, ale w każdym przypadku będzie musiało zaktualizować inne informacje dotyczące księgowości. Jeśli masz przydzielone zjonizm małych obiektów (zdarza się), to wysiłek wymagany do uwolnienia ich wszystkich może mieć znaczący wpływ.

Jeśli możesz to zaaranżować, możesz spróbować skonfigurować swoją aplikację tak, aby wiedziała, że ​​zakończy działanie, zapisz wszystkie oczekujące prace (konfiguracja, dokumenty, cokolwiek) i wyjdź z nich niezbyt.

+0

Oczywiście, nie wywoływanie niektórych funkcji jest szybsze niż wywoływanie tego :) Ale pytanie nie dotyczyło tego, ale specyfika menedżera sterty. Przyspieszenie zamykania to tylko kontekst. – Constantin

4

Jeśli nie wyczyścisz wszystkich zasobów podczas zamykania aplikacji, sprawi to, że prawie niemożliwe będzie wykrycie, czy masz naprawdę poważne problemy - takie jak wycieki pamięci - które byłyby większym problemem niż powolne wyłączanie . Jeśli interfejs użytkownika szybko zniknie, użytkownik pomyśli, że zamknął się szybko, nawet jeśli ma jeszcze wiele do zrobienia. W interfejsie użytkownika percepcja prędkości jest ważniejsza niż rzeczywista prędkość. Gdy użytkownik wybierze opcję "Zamknij aplikację", główne okno aplikacji powinno natychmiast zniknąć. Nie ma znaczenia, czy aplikacja zajmie kilka sekund po tym, aby zwolnić wszystko, co wyjdzie z wdziękiem, użytkownik nie zauważy.

+0

Po pierwsze, nie wspomniałem o żadnym interfejsie użytkownika. Pytanie jest ogólne. Po drugie, błędy stron wpływają na cały system, a nie tylko na aplikację, która je powoduje. Tak więc postrzeganym obrazem będzie to, że aplikacja zniknie z ekranu, a następnie HDD zacznie szlifować, a OS usunie niepotrzebne błędy strony. – Constantin

Powiązane problemy