2010-10-06 14 views
8

Mam projekt, który używa STL dużo. Teraz pracuję nad przeniesieniem projektu do konkretnej platformy, która nie obsługuje wyjątków. Mogę wyłączyć wyjątki, ale nadal muszę obsługiwać błędy STL.Obsługa błędów STL bez wyjątków

Czy istnieje jakieś podejście do obsługi błędów STL poprawnie z wyłączonymi wyjątkami? Czy istnieje implementacja STL innej firmy, która pomaga w tym?

Odpowiedz

6

Problem z pobraniem istniejącego współdzielonego zasobu biblioteki std i kompilacją z wyłączonymi wyjątkami jest taki, że std-container wchodzi w interakcję z założeniem, że wyjątki są włączone. Używając wyjątków, operator new rzuci, jeśli nie może uzyskać pamięci, bez wyjątków, operator new zwraca wartość 0, której nie mogą obsłużyć std.

Jednym ze sposobów jest użycie tylko algorytmów STL + wektor. Możesz replikować około 95% tego, co używają inne pojemniki. Problem polega na tym, że większość implementacje STL Zakładamy, że

v.reserve(v.size()+1); 
assert(v.size()+1<=v.capacity()); 

nigdy nie będzie dochodzić (ponieważ rezerwa rzuci jeśli nie ma pamięci). Aby upewnić się, że to nigdy nie wyrzuci, użyłem pojemników o ustalonej pojemności, tj. Pojemników o pojemności ustalonej podczas kompilacji. Zasadniczo są to wektory, w których przechodzę w specjalnym podzielniku. Następnie możesz sprawdzić max_size() kontenera przed wstawieniem. Następnie unikaj używania rzeczy takich jak at(). Aby uzyskać jeszcze lepszą predykcję, użyj basic_string zamiast wektora. To zmusza do przechowywania tylko typów POD, które nigdy nie wyrzucą, gdy zostaną skopiowane lub domyślnie skonstruowane. Wymagania dotyczące pamięci są łatwiejsze do obliczenia.

Innym podejściem jest stosowanie natrętnych pojemników. Nie wyrzucają (poza niewłaściwym wykorzystaniem interfejsu), ponieważ nigdy nie nabywają pamięci.

5

Prawdopodobnie starsza wersja stlport może być skonfigurowana tak, aby nie używać wyjątków. To oczywiście jest niestandardowe, ale spełnia twoje wymagania.