Эта страница MSDN упоминает, что существуют nothrow версии new
и delete
. nothrow new
вполне известная вещь - пустой указатель возвратов вместо того, чтобы выдать исключение, если выделение памяти перестало работать. Но что nothrow delete
упомянутый там?
Вероятно, они относятся к функциям необработанного выделения памяти оператора new
и оператора delete
.
Когда вы вызываете определенную версию размещения выражения new (т.е. new expression с дополнительными параметрами; все они официально называются формами placement вида new
), и функция выделения памяти оператор new
выполняется успешно, но процесс по какой-то другой причине терпит неудачу (конструктор бросает), реализация должна прервать процесс и автоматически освободить выделенную память, вызвав соответствующую версию оператора delete
. "Соответствующим вариантом" оператора delete
в данном случае является вариант, имеющий тот же набор параметров, что и оператор new
, ранее использовавшийся для выделения памяти (разумеется, за исключением самого первого параметра).
Это относится и к nothrow
версии оператора new
. При использовании nothrow
формы выражения new, вызывается nothrow
версии оператора new
и затем конструируется объект в выделенной памяти. Если конструктор не работает (бросает), то реализация выражения new освобождает выделенную память с помощью nothrow
версии оператора delete
. По сути, это единственная причина существования данной версии оператора delete
.
Другими словами, версия nothrow
оператора delete
существует для весьма специфических внутренних целей. Обычно вы не должны сами его называть и, может быть, вам действительно не нужно знать о его существовании. Однако, стоит знать, что по вышеописанным причинам при создании собственной версии оператора new
с дополнительными параметрами, всегда полезно предоставлять соответствующую версию оператора delete
с тем же набором дополнительных параметров.