Вы не можете обрабатывать сбои выделения в современных операционных системах; в качестве оптимизации производительности они обычно перезаписывают память. Например, если вы позвоните по номеру malloc()
и попросите действительно огромный кусок памяти в Linux, он преуспеет , даже если памяти, необходимой для его поддержки, на самом деле нет . Только когда вы обращаетесь к нему, ядро фактически пытается выделить страницы для его поддержки, и в этот момент уже слишком поздно говорить вам, что распределение все равно не удалось.
Итак:
За исключением особых случаев, не беспокойтесь об ошибках распределения. Если машине не хватает памяти, это катастрофический сбой, от которого невозможно надежно восстановиться.
Тем не менее, рекомендуется перехватывать необработанные исключения и регистрировать вывод e.what()
, а затем повторно throw
, поскольку это может быть более информативным, чем обратная трассировка, и типичные реализации библиотеки C ++ этого не делают автоматически для вас.
Весь огромный поток выше о том, что вы не можете рассчитывать на сбой при исчерпании памяти, является полным и полным мусором. Стандарт C (++) может не гарантировать этого, но при современных сбоях систем - это only , на которую вы можете положиться, если у вас не хватает памяти . В частности, вы не можете рассчитывать на получение NULL
или любого другого указания от вашего распределителя, вплоть до исключения C ++.
Если вы оказались во встроенной системе, где нулевая страница доступна, я настоятельно рекомендую вам исправить это путем сопоставления недоступной страницы в этом месте. Нельзя полагаться на то, что люди повсюду проверяют наличие NULL
указателей, но это можно исправить, сопоставив страницу один раз , а не пытаясь исправить все возможные (прошлое, настоящее и будущее ) место, в котором кто-то мог пропустить NULL
.
Я уточню вышесказанное, сказав, что, возможно, вы используете какой-то пользовательский распределитель или что вы находитесь в системе, которая не выполняет чрезмерную фиксацию (в качестве примера можно привести встроенные системы без swap, но не единственный пример). В этом случае, возможно, , вы сможете корректно справиться с нехваткой памяти, в вашей системе . Но в целом в XXI веке я боюсь, что вы вряд ли получите шанс; первое, что вы узнаете, что вашей системе недостаточно памяти, - это когда вещи начинают падать.