2013-02-20 13 views
9

Czy ma sens kontynuowanie wykonywania po wychwyceniu wyjątku EOutOfMemory, czy teraz sterty lub stos są uszkodzone z dużym prawdopodobieństwem?Czy można odzyskać wyjątek EOutOfMemory?

nie mam na myśli przypadek EOutOfMemory spowodowanego przez poprzedniego uszkodzenia pamięci z powodu błędów, takich jak pisanie na dzikim adres, to znaczy prawidłowy kod, który wywołuje GetMem i łapie EOutOfMemory.

+0

czasami tak jest. Widziałem ludzi próbujących przydzielić bufor pamięci 3GB w aplikacjach Win32 :-) To zależy od tego, co naprawdę próbowałeś zrobić, zanim dostałeś błąd. W niektórych przypadkach można je odzyskać. –

Odpowiedz

6

Moim zdaniem nie ma sensu kontynuować pracy z EOutOfMemory. Z mojego doświadczenia wynika, że ​​szanse są bardzo wysokie, ponieważ sterty zostaną uszkodzone, a przyszłe błędy można się spodziewać. Zwykle najbezpieczniejszym sposobem postępowania jest zakończenie procesu.

+0

Podejrzewam, że nie można go odzyskać, ale nie jestem pewien. Nie znam wewnętrznych elementów FastMM i być może zarządzania pamięcią systemu Windows. – kludg

+1

W naszym serwerze przechowujemy pamięć podczas inicjalizacji, która jest wydana na EOutOfMemory, tak aby wyjątek i inne rejestrowanie miały trochę miejsca do manewru, zanim zabijemy proces. –

+0

@MarjanVenema To też jest ryzykowne, przynajmniej jeśli twój drugi kod będzie używał uszkodzonej sterty. Zauważ, że RTL Delphi przydziela pojedynczą instancję 'EOutOfMemory' przy starcie, tak że nie musi wykonywać alokacji sterty w celu podniesienia wyjątku. –

1

Generalnie zgadzam się, że nie ma sensu próbować dojść do siebie. Ale może być użyteczny w określonych okolicznościach. Na przykład przydzielając duże ilości pamięci zależnej od wyborów użytkownika, a jeśli się nie powiedzie, możesz się wycofać w sposób czysty i pozwolić na ponowienie z innymi ustawieniami. Robię to dla konwersji chmur punktów do siatek 3D, co obejmuje pewne etapy, w których wymagania dotyczące pamięci nie są z góry znane. Wystarczy ostrożne kodowanie kroków, które chcesz odzyskać, z natychmiastową i czystą ścieżką wycofania. Na przykład niektóre z moich struktur danych to mapy bitowe lub bufory z każdą linią przydzieloną osobno w celu zminimalizowania problemów z pofragmentowaną pamięcią. Konstruktory próbują ... z wyjątkiem obsługi i wyrzucenia wyjątku EOutOfMemory, a destruktory zwolnią wszystkie linie, które zostały już przydzielone. Nie mogę zagwarantować, że to zawsze zadziała, ale zadziałało wystarczająco dobrze, aby było warto.

Powiązane problemy