Стих C ++ Standard 3.7.4.2 говорит: -
Библиотека предоставляет определения по умолчанию для глобальных функций выделения и освобождения. Некоторые функции глобального распределения и освобождения являются заменяемыми (18.6.1). Программа на C ++ должна содержать не более одного определения заменяемой функции выделения или освобождения. Любое такое определение функции заменяет версию по умолчанию, предоставленную в библиотеке (17.6.3.6).
Следующие функции выделения и освобождения (18.6) неявно объявляются в глобальной области видимости в каждой единице перевода программы.
void* operator new(std::size_t) throw(std::bad_alloc);
void* operator new[](std::size_t) throw std::bad_alloc);
void operator delete(void*) throw();
void operator delete[](void*) throw();
Эти неявные объявления вводят только имена функций, оператор new, оператор new [], оператор delete, оператор delete []. [Примечание: неявные объявления не вводят имена std, std :: bad_alloc и std :: size_t или любые другие имена, которые библиотека использует для объявления этих имен. Таким образом, выражение newexpression, delete-expression или function, которое ссылается на одну из этих функций без включения заголовка, является правильно сформированным. Однако обращение к std, std :: bad_alloc и std :: size_t является некорректным, если имя не было объявлено путем включения соответствующего заголовка. —Конечная записка]
Кроме того, std::nothrow
версия operator new
требует включения заголовка.
Стандарт, однако, не определяет неявное включение файлов заголовков в другие файлы заголовков. Поэтому безопасно и легко следовать стандарту, когда упоминаются имена std::bad_alloc
и т. Д.