Почему функция с этой сигнатурой
void* operator new (std::size_t size);
Не могу называть код таким образом
void* mem = new(100);
Но скорее это нужно назвать так
void mem = ::operator new(100);
Ключевое слово new
и new
operator new
- это разные вещи.
Ключевое слово new
:
operator new
для выделения памяти. Он может быть перегружен для выделенного типа. Ключевое слово new
принимает необязательные аргументы, которые передаются operator new
, это позволяет размещать new
и не бросающий new
синтаксис, см. #include <new>
.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
неявно статичен при перегрузке.
operator new
может быть перегружен. Максим так и сказал в своем ответе.
Для этого существует синтаксическая причина: размещение нового. При размещении new вы можете вызвать конструктор без выделения памяти для него. Синтаксис:
#include <new>
Foo* foo = new(bufferPointer) Foo();
Очевидно, что частью этого является точный синтаксис, который вы пытались вызвать ::operator new()
...
new
, ноoperator new