Как проверить, можно ли создать карту, если я не использую исключения? - PullRequest
2 голосов
/ 11 октября 2011

Я хочу использовать map в C ++ , но я не использую исключения. После использования map<int, int> my_map в функции, как я могу проверить, удалось ли ей выделить память внутренне (я понимаю, что с исключениями любой новый внутри, который не может выделить память, вызовет исключение)?

Ответы [ 4 ]

3 голосов
/ 11 октября 2011

Независимо от того, используете ли вы исключения, стандартные контейнеры (если они используют свои распределители по умолчанию) выдают std::bad_alloc в случае сбоя выделения памяти. Если вы не поймете это, ваша программа прекратит работу - поэтому нет способа проверить успешность, не поймав исключение в этом случае.

Если вы действительно хотите уничтожить исключения (что, на мой взгляд, является плохой идеей, даже если вы не хотите использовать Стандартную библиотеку), то вам придется отказаться от стандартных контейнеров, переписав все контейнеры, которые вы хотите использовать нестандартная модель распределения, а также проверять и распространять любые сбои. Все стандартные контейнеры предполагают, что распределение будет либо успешным, либо выбросом, поэтому их нельзя использовать с распределителем, который не дает такой гарантии.

1 голос
/ 11 октября 2011

Если вы не хотите создавать исключения, вы должны написать свой собственный распределитель и использовать его на своей карте: typedef std::map<int, int, std::less<int>, MyAllocator> my_map;.

Однако вам придется придумать свою собственную внутреннюю логику для обработки ситуаций нехватки памяти, а стандартный интерфейс не предоставляет никакого очевидного интерфейса.

Как гибридное решение, вы могли бы написать распределитель, который берет память из статического пула памяти и вызывает некоторый глобальный обработчик ошибок, когда он заполнен.

1 голос
/ 11 октября 2011

Независимо от того, используете ли вы исключения, библиотека C ++ использует их для ошибок распределения.Если вы действительно хотите избежать их, вам нужно узнать о распределителях или, по крайней мере, о вашем собственном глобальном операторе new и придумать какую-то другую схему (вызов функции из глобальной переменной?), Когда память недоступна.

0 голосов
/ 11 октября 2011

Что ж, отключенные исключения не являются частью стандарта C ++, поэтому вы будете переходить к поведению, специфичному для компилятора. При этом, по крайней мере с GCC, оператор по умолчанию new вместо генерации исключения в случае сбоя malloc () будет просто прерывать программу, если она скомпилирована с -fno-exceptions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...