Я использую RTL в качестве динамической библиотеки. Это позволяет переопределить оператор new / delete в глобальном пространстве имен, потому что компоновщик сначала найдет мою реализацию. Я мог бы полагаться на malloc () и free (), чтобы делать вещи выделения, но есть такие вещи, как объекты 'new_handlers' и 'std :: nothrow'. Шаблоны стандартной библиотеки требуют определенного поведения операторов new / delete, но реализация стандартной библиотекой new / delete в глобальном пространстве имен выходит за рамки! Есть ли реализация в другом пространстве имен из стандартной библиотеки, которую я могу использовать?
Я мог бы динамически определить адрес имплементации стандартной библиотеки (в dll) и вызвать его через указатель, но это не подлежит вознаграждению за красоту. Будет ли это работать? (Я использую Borland C ++ Builder 2006).
РЕДАКТИРОВАТЬ Я хочу задать этот вопрос:
Этот пример кода ведет себя подобно оператору RTL new (size_t)? Или я не так понял?
void *new_replacement(size_t p_size)
{
void *l_retval = NULL;
while(l_retval == NULL && p_size != 0)
{
l_retval = malloc(p_size);
if (l_retval == NULL)
{
void (*l_handler)() = std::set_new_handler(NULL);
// could not find another way to obtain the current new_handler
if (l_handler == NULL) throw std::bad_alloc();
std::set_new_handler(l_handler);
l_handler();
}
}
return l_retval;
}