Какую реализацию по умолчанию new / delete из std-rtl я должен использовать при переопределении new / delete в глобальном пространстве имен? - PullRequest
2 голосов
/ 15 июля 2011

Я использую 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;
}

1 Ответ

2 голосов
/ 15 июля 2011

Вы заменены, но не переопределены реализацией по умолчанию, и вы больше не можете ее вызывать.Вам придется переопределить его - например, используя malloc() и заботясь о его возвращаемом значении, это не очень сложно.

...