Как сохранить указатель на переопределенный оператор? - PullRequest
2 голосов
/ 19 декабря 2011

Я перегружен новыми и удаляю операторов. Я хочу сохранить указатели на «старые» new и delete, чтобы называть их «новыми» new и delete. Например:

#include "h.h"
void * operator new ( size_t size, /*args*/ ) throw (std::bad_alloc)
{
    void * p = 0;
    p = original_new(size); //calling for 'old' new
    //some code
    return p;
}

и аналогичный оператор delete.

Итак, я пытаюсь в своем заголовочном файле набрать следующее:

static void * (*original_new)(size_t) = ::operator new;
static void * (*original_new_arr)(size_t) = ::operator new[];
static void (*original_delete)(void *) = ::operator delete;
static void (*original_delete_arr)(void *) = ::operator delete[];

Он успешно скомпилирован, но у меня дамп ядра при запуске. Можно назвать malloc в new плохо, это действительно плохо идея. Можно позвонить new(std::nothrow), но это тоже плохо.

1 Ответ

2 голосов
/ 19 декабря 2011

Вам не нужно сохранять указатели; определение места размещения нового оператора (любой operator new функция, которая принимает более одного аргумента) не удалить существующих операторов; это просто перегружает их. Чтобы позвонить стандартная функция оператора новая функция от оператора размещения новая функция:

p = ::operator new( size );

Обратите внимание, что вы не хотите сделать это, если ваше место размещения вернется все, кроме точного адреса, возвращаемого ::operator new. Иначе, delete не будет работать. Если вы используете новое место размещения, которое возвращает что-либо кроме указателя, возвращаемого ::operator new, вам нужно определить новый глобальный operator delete (потому что это тот, который будет называется), что в свою очередь означает, что вы должны определить новый стандарт operator new, так что он будет правильно работать с вашим новым operator delete. Чтобы избежать необходимости реализовывать все управление памятью самостоятельно, используйте malloc и free в своем Реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...