Что нет удаления в C ++? - PullRequest
       10

Что нет удаления в C ++?

10 голосов
/ 25 декабря 2009

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

1 Ответ

18 голосов
/ 25 декабря 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...