Этот код будет работать так, как есть, , но , если вы сделаете это, вам в значительной степени нужно написать соответствующий ::operator delete
, который будет работать с ним:
void operator delete(void *block) throw() {
::free(block);
}
Лично я бы, вероятно, изменил ваш код на что-то вроде:
void *operator new(size_t size) throw(std::bad_alloc)
{
void *p = malloc(size);
if(!p)
throw bad_alloc();
return p;
}
Я предпочитаю инициализировать все, что могу, а не создавать неинициализированную переменную, и только потом присваивать ей значение. В этом случае разница довольно незначительна, но я считаю, что эту привычку стоит развивать.
Поскольку он более эффективен, чем реализация по умолчанию operator new
, я бы сказал, что есть вероятность, что нет, он не будет более эффективным и вполне может быть менее эффективным. В основном вы указали, сколько стандартных библиотек было реализовано на заре C ++, но с тех пор многие (большинство?) Проделали большую работу над реализацией ::operator new
, чтобы более точно адаптировать ее к динамическому распределению памяти. для использования в C ++ (где malloc
в основном ориентирован на то, как он используется в C, который обычно, по крайней мере, немного отличается).
Что касается new[]
, то да, это просто изменение сигнатуры функции. Несмотря на то, что используются для однократного или множественного распределения, требования к operator new
и оператору new [] `идентичны.