Ответ 1
В С++ существует очень тонкая разница между operator new
и оператором new
. (Прочтите это снова... порядок важен!)
Функция operator new
является аналогом С++ функции C malloc
. Это источник распределения памяти, ответственный только за создание блока памяти, на котором можно создавать объекты. Он не вызывает никаких конструкторов, потому что это не его работа. Обычно вы не видите operator new
, который используется непосредственно в коде С++; это выглядит немного странно. Например:
void* memory = operator new(137); // Allocate at least 137 bytes
Оператор new
- это ключевое слово, которое отвечает за выделение памяти для объекта и вызов его конструктора. Это то, что чаще всего встречается в коде на С++. Когда вы пишете
int* myInt = new int;
Вы используете новый оператор для выделения нового целого числа. Внутренний оператор new
работает примерно так:
- Выделите память для хранения запрошенного объекта с помощью
operator new
. - Вызывает конструктор объекта, если он есть. Если это порождает исключение, освободите вышеуказанную память с помощью
operator delete
, а затем распространите исключение. - Возвращает указатель на вновь построенный объект.
Поскольку оператор new
и operator new
являются отдельными, можно использовать ключевое слово new
для построения объектов без фактического выделения какой-либо памяти. Например, знаменитое новое размещение позволяет вам создавать объект на произвольном адресе памяти в пользовательской памяти. Например:
T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'
Перегрузка оператора new
путем определения пользовательской функции operator new
позволяет использовать new
таким образом; вы указываете, как происходит распределение, и компилятор С++ подключит его к оператору new
.
Если вам интересно, ключевое слово delete
работает одинаково. Там функция освобождения, называемая operator delete
, ответственная за удаление памяти, а также оператор delete
, ответственный за вызов дескрипторов объектов и освобождение памяти. Однако operator new
и operator delete
можно использовать вне этих контекстов вместо C malloc
и free
, например.