Что такое nothrow delete в С++?

На этой странице MSDN упоминается, что есть нечеткие версии new и delete. nothrow new - довольно известная вещь - возвращает null вместо того, чтобы бросать исключение, если сбой памяти не выполняется. Но что там упомянуто nothrow delete?

Ответ 1

Они, вероятно, ссылаются на функции выделения необработанных памяти operator new и operator delete.

Когда вы вызываете определенную версию нового выражения (например, новое выражение с дополнительными параметрами, все они официально называются формами размещения new), а функция выделения памяти operator new выполняется успешно, но процесс не выполняется позже по какой-либо другой причине (конструктор бросает), реализация должна прервать процесс и автоматически освободить выделенную память, вызвав соответствующую версию operator delete. "Соответствующая версия" operator delete в этом случае - это версия, которая имеет тот же набор параметров, что и функция operator new, ранее использовавшаяся для выделения памяти (за исключением самого первого параметра, конечно).

Это относится к версии nothrow operator new. Когда вы используете форму nothrow нового выражения, она вызывает nothrow версию operator new, а затем создает объект в выделенной памяти. Если конструктор выходит из строя (бросает), реализация нового выражения освобождает выделенную память с помощью nothrow версии operator delete. Это, по сути, единственная причина существования этой версии operator delete.

Другими словами, версия nothrow operator delete существует для очень специфических внутренних целей. Обычно вы не должны называть его самим, и, может быть, вам не нужно знать о его существовании. Однако стоит знать, что по причинам, описанным выше, всякий раз, когда вы создаете собственную версию operator new с дополнительными параметрами, всегда рекомендуется предоставить соответствующую версию operator delete с тем же набором дополнительных параметров.