Ich habe ein Projekt, das sehr oft mit STL arbeitet. Jetzt arbeite ich an der Portierung des Projekts auf eine bestimmte Plattform, die keine Ausnahmen unterstützt. Ich kann Ausnahmen deaktivieren, aber ich muss immer noch STL-Fehler behandeln.
Gibt es einen Ansatz, um STL-Fehler korrekt mit deaktivierten Ausnahmen zu behandeln? Gibt es eine STL-Implementierung von Drittanbietern, die dabei hilft?
Das Problem mit einem vorhandenen std-Bibliotheks-Coontainer und dem Kompilieren mit deaktivierten Ausnahmen besteht darin, dass die Schnittstellen des std-Containers selbst davon ausgehen, dass Ausnahmen aktiviert sind. Wenn Ausnahmen verwendet werden, wird der Operator new ausgelöst, wenn er keinen Speicher abrufen kann, und Operator new gibt stattdessen eine 0 zurück, die von den Standardcontainern nicht verarbeitet werden kann.
Ein Ansatz besteht darin, nur STL-Algorithmen + Vektor zu verwenden. Sie können ungefähr 95% von dem, was die anderen Container machen, replizieren. Das Problem ist, dass die meisten STL-Implementierungen davon ausgehen,
%Vor%wird niemals aktiviert (da Reserve wird werfen, wenn kein Speicher vorhanden ist). Um sicherzustellen, dass dies niemals ausgelöst wird, habe ich Behälter mit "fester Kapazität" verwendet, d. H. Behälter mit einer zur Kompilierzeit festgesetzten Kapazität. Im Grunde sind das Vektoren, in denen ich einen speziellen Allokator übergebe. Dann können Sie die max_size () des Containers vor dem Einfügen überprüfen. Dann vermeiden Sie Dinge wie at (). Für eine noch bessere Vorhersage verwenden Sie basic_string anstelle von vector. Dies zwingt Sie, nur POD-Typen zu speichern, die niemals kopiert werden, wenn sie kopiert oder defaultiert werden. Plus Speicheranforderungen sind einfacher zu berechnen.
Ein anderer Ansatz besteht darin, intrusive Container zu verwenden. Diese werfen (außerhalb des Missbrauchs der Schnittstelle vielleicht) nicht, da sie nie Speicher an erster Stelle erwerben.