Глобальный новый синтаксис вызова оператора

0

Почему функция с этой сигнатурой

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

Не могу называть код таким образом

void* mem = new(100);

Но скорее это нужно назвать так

void mem = ::operator new(100);
  • 1
    Имя функции не new , но operator new
Теги:
new-operator

2 ответа

3
Лучший ответ

Ключевое слово new и new operator new - это разные вещи.

Ключевое слово new:

  1. Вызовите operator new для выделения памяти. Он может быть перегружен для выделенного типа. Ключевое слово new принимает необязательные аргументы, которые передаются operator new, это позволяет размещать new и не бросающий new синтаксис, см. #include <new>.
  2. Вызов конструктора объекта.
  3. Если конструктор выбрасывает, вызовите соответствующий operator delete чтобы освободить память. Обратите внимание, что если operator delete не доступен (не общественности), то new сбой во время компиляции, потому что operator delete не может быть вызван, если конструктор бросков и памяти будут потеряны.

Ключевое слово new не может быть перегружено, оно всегда делает эти шаги. Это operator new с шага 1, который может быть перегружен, как правило, вместе с operator delete с шага 3.

Другими словами, X* p = new X(a, b, c); под капотом делает что-то вроде (псевдо-код):

X* p = static_cast<X*>(X::operator new(sizeof(X))); // 1. allocate memory
try { 
    p->X(a, b, c); // 2. invoke the constructor
}                              
catch(...) { 
    X::operator delete(p); // 3. free the memory if the constructor throw
    throw; 
}

В приведенном выше случае, если X не перегружает свой operator new, это вызов global ::operator new. Обратите внимание, что X::operator new неявно статичен при перегрузке.

  • 0
    Так что на самом деле оператор new не является перегрузкой оператора? Потому что new это ключевое слово, а не оператор, или это функция? Или есть какая-то разница между этими двумя?
  • 0
    operator new может быть перегружен. Максим так и сказал в своем ответе.
Показать ещё 13 комментариев
0

Для этого существует синтаксическая причина: размещение нового. При размещении new вы можете вызвать конструктор без выделения памяти для него. Синтаксис:

#include <new>
Foo* foo = new(bufferPointer) Foo();

Очевидно, что частью этого является точный синтаксис, который вы пытались вызвать ::operator new()...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню