Информация о размере при перегрузке нового оператора С++

Оператор выделения памяти С++ имеет вид operator new (size_t s). Когда я перегружаю оператор new для объекта класса типа T, гарантирует ли его входной аргумент (т.е. size_t s) оператора new точно sizeof(T)? Если да, то почему эта функция по-прежнему нуждается в размере в качестве входного аргумента?

Ответ 1

Можно переопределить оператор new в базовом классе и использовать его для выделения объектов типа производного класса.

struct Base
{
    void* operator new (size_t s) { ... }
    int a;
};

struct Derived : public Base
{
   int b;
};

Derived* d = new Derived; 

При распределении памяти для Derived будет использоваться Base::operator new(size_t). Значение аргумента будет sizeof(Derived). Без этого аргумента мы не можем выделить нужное количество памяти для объекта типа Derived.