Современные компиляторы C++ автоматически обрабатывают проверки NULL для операций new, но старые компиляторы могут этого не делать. Чтобы обеспечить правильную обработку ошибок на устаревших системах, ты можешь установить функцию-обработчик new с помощью std::set_new_handler().
Обработчик new — это пользовательская функция, которую среда выполнения вызывает при ошибке выделения памяти. Вместо возврата NULL, operator new будет вызывать твой обработчик, который может:
#include <new>
#include <iostream>
class AllocationError : public std::exception {};
void myNewHandler() {
throw AllocationError();
}
int main() {
std::set_new_handler(myNewHandler);
// new никогда не вернёт NULL после этого момента
Fred* p = new Fred();
}
Если твой компилятор не поддерживает исключения, используй такой подход:
void myNewHandler() {
std::cerr << "Memory allocation failed!" << std::endl;
abort();
}
Критическое замечание: обработчики new не защищают конструкторы глобальных или статических объектов, так как они вызываются до выполнения main(). Нет надёжного способа гарантировать, что std::set_new_handler() будет вызван до инициализации всех глобальных объектов.
Даже размещение std::set_new_handler() в конструкторе глобального объекта не даёт гарантии, так как порядок инициализации единиц трансляции непредсказуем.
Для современной разработки на C++ используй актуальный компилятор со встроенными средствами безопасной работы с памятью, вместо того чтобы полагаться на обработчики new в критически важных приложениях.
Функция std::set_new_handler() позволяет зарегистрировать callback, который будет вызван, когда operator new не сможет выделить память, предотвращая возврат NULL.
Новый — ещё не проверен сообществом
Вы