Прежде всего, не путайте выражение new / delete с функцией operator new()
.
Выражение является языковой конструкцией, которая выполняет конструирование и уничтожение. Оператор - это обычная функция, которая выполняет выделение памяти (де).
Только выражения по умолчанию (operator new(size_t)
и operator delete(void *)
могут использоваться с выражениями по умолчанию new
и delete
. Все остальные формы в общем называются формами "размещения", а для тех, которые вы можете использовать только new
, но вы должны уничтожать объекты вручную, вызывая деструктор. Формы размещения имеют довольно ограниченную и специализированную потребность. Безусловно, наиболее полезной формой размещения является глобальное размещение-новое, ::new (addr) T
, но поведение этого изменить нельзя. (вероятно, поэтому он единственный популярный).
Все new
операторы должны возвращать void *
. Эти функции распределения являются гораздо более низкоуровневыми, чем вы могли бы оценить, поэтому в основном вы «будете знать, когда вам нужно связываться с ними».
Повторим: C ++ разделяет понятия построения объекта и выделения памяти. Все, что вы можете сделать, это предоставить альтернативные реализации для последнего.