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.