Это просто: перестаньте верить, что вам следует использовать стандартную библиотеку для всего .
Стандартная библиотека предназначена для использования по умолчанию в качестве места, куда вы обращаетесь за функциональностью.Однако это не означает, что это уместно в любой ситуации.Например, программирование ядра.Это довольно нишевая среда, где вам нужен прямой и явный контроль над вещами, о которых большинство программистов C ++ не заботятся.
Стандартный механизм C ++ для сигнализации о сбоях, особенно что-то вроде выделения внутренней памяти изконтейнер, это выбросить исключение.Подавляющее большинство приложений не потрудится поймать это исключение;в том маловероятном случае, если у них не будет памяти, они просто умрут.Что хорошо для них.Возвращать код ошибки в этих случаях в лучшем случае сложно (рассмотрим перераспределение std::vector<std::string>
. Что произойдет, если один из внутренних std::string
s получит OOM? Кто получит код ошибки? Как бы вы сигнализировали об ошибке?конструктора, так как исключение выдается std::string
конструктором копирования?).И только люди, которые действительно нуждаются в заботе, будут в достаточной степени заботиться о том, чтобы ее поймать.
Вы работаете в ограниченной среде, среде, для которой стандартная библиотека не предназначена для обработки.Так что ... не используйте его в этой среде.
Я предлагаю отследить копию EASTL .Он действительно предназначен для такого рода вещей.В репозитории Github, с которым я вас связывал, есть исправления ошибок и т. Д., Но в большинстве случаев он остается тем же.Это неплохой код.Их STL-подобные контейнеры обеспечивают большую часть интерфейса, поэтому они могут быть в основном заменой.Но они предоставляют специальные функциональные возможности для конкретного управления распределением памяти.И они не бросают (или, по крайней мере, вы можете отключить бросание).