понедельник, 30 августа 2010 г.

Простейшая реализация оператора new

Самая простая пользовательская реализация оператора new, соответствующая всем требованиям стандарта, может выглядеть так:
#include <new>
#include <cstdlib>
void* operator new(std::size_t size) throw(std::bad_alloc) {
if (size == 0)
size = 1;
while (true) {
void* ret = std::malloc(size);
if (ret != 0)
return ret;
std::new_handler handler = std::set_new_handler(0);
if (handler != 0) {
std::set_new_handler(handler);
(*handler)();
}
else
throw std::bad_alloc();
}
}

Строка 1-2: Включение необходимых файлов.
Строка 3: Оператор new может вызывать только исключение std::bad_alloc.
Строки 4-5: Оператор new должен корректно отрабатывать выделение нулевого количество байт.
Строка 6: Выделение памяти и вызов функции-обработчика, в случае невозможности выделения памяти, должны выполняется внутри бесконечного цикла.
Строка 7: Выделение памяти.
Строки 8-9: Если выделение памяти прошло успешно, оператор new возвращает указатель на нее.
Оператор new в случае невозможности, по какой-либо причине, выделения нужный объем памяти, вызывает функция-обработчик, если она задана или вызывает исключение std::bad_alloc(), если она не задана.
Строка 10: Получение указателя на функцию-обработчик.
Строка 11-13: Если функция-обработчик задана, оператор new вызывает его.
Строка 15-16: Если функция-обработчик не задана, оператор new вызывает исключение std::bad_alloc().
Исходный код примера здесь.

Комментариев нет:

Отправить комментарий