Оператор выделения памяти С++ имеет вид 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
.