Синтаксис оператора new

186
23 мая 2018, 02:20

Вот здесь предоставлен прототип оператора new :

void* operator new (std::size_t size);

Но почему он используется с помощью совсем другого синтаксиса, например:

int *a = new int;

Т.е. почему не пишутся круглые скобки и за место sizeof(TYPE) просто TYPE?

Answer 1

Использование оператора new обладает специальными свойствами. Когда он используется непосредственно как оператор в составе выражения (new expression), как в вашем примере:

 int* a = new int;

то компилятор делает три вещи:

  • вызовет функцию void* operator new (std::size_t size); для выделения памяти под создаваемый объект
  • вызовет конструктор создаваемого объекта (в данном примере отсутствует)
  • сгенерирует код обработки исключений, выбрасываемых из конструктора (в данном примере отсутствует)

Однако можно явно использовать непосредственно саму функцию operator new для выделения куска неинициализированной памяти:

void * p = ::operator new(sizeof(int));

Тут никакой магии нет, это обычный вызов функции.

Стоить отметить, что большинство других операторов также можно вызывать "как операторы" и "как функции", например:

 struct MyStruct;
 bool operator ==(MyStruct const & left, MyStruct const & right);
 MyStruct x;
 MyStruct y
 if(x == y) // синтаксис оператора
 if(::operator ==(x, y)) // синтаксис функции
Answer 2

потому что у оператора new много способов использования.

Вот это вариант:

int* a = new int;

выделяет память из кучи и инициализирует объект, вызывая какой-нибудь конструктор.

Этот вариант:

void* operator new (std::size_t size);

только выделяет память и возвращает указатель на эту область не инициализуруя объект, подобно тому как работает функция malloc из языка С.

Update

Перевожу специально для вас из того ресурса:

  MyClass * p1 = new MyClass;
      // выделяет память вызывая operator new (sizeof(MyClass))
      // затем строит объект в этой области памяти 
READ ALSO
ROI треугольной/трапециевидной формы

ROI треугольной/трапециевидной формы

Как задать в С++ d OpenCV 3 ROI треугольной или трапециевидной формы?

201
Формат инициализации вектора типа Vec2i

Формат инициализации вектора типа Vec2i

Подскажите, пожалуйста, синтаксис, как инициализировать вектор типа

186
Не работает дружественный класс

Не работает дружественный класс

Не работает дружественный класс (ошибка в функции show)Как организовать доступ к классу Teacher?

176
Нужно найти ошибку в коде

Нужно найти ошибку в коде

У меня почему-то программа не видит ArrayПодскажите в чем ошибка и как правильно реализовать вычитание элемента от матрицы?

251