Когда требуется библиотека #include в C++?

согласно этой справочной записи для оператора new ( http://www.cplusplus.com/reference/std/new/operator%20new/ ) :

глобальный динамический оператор хранения функции специального стандарта библиотека:

  • все три версии operator new объявляются в глобальном пространстве имен, не в пространстве имен std.
  • первая и вторая версии неявно объявляются в каждом блок перевода Программа на C++: в заголовок не должен быть включены для их присутствия.

мне кажется, это означает, что третья версия operator new (placement new) неявно объявлена в каждой единице перевода программы на C++ и заголовке <new> необходимо включить, чтобы он присутствовал. Это верно?

если да, то как с помощью компиляторов G++ и MS VC++ Express я могу скомпилировать код, используя третью версию новых без #include <new> в моем исходном коде?

кроме того, стандартная запись ссылки библиотеки C++ MSDN на operator new дает некоторый пример кода для трех форм operator new, который содержит #include <new> оператор, однако пример, похоже, компилируется и запускается точно так же для меня без этого включения?

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new delete
   MyClass* fPtr = new MyClass;
   delete fPtr;

   // The second form of new delete
   char x[sizeof( MyClass )];
   MyClass* fPtr2 = new( &x[0] ) MyClass;
   fPtr2 -> ~MyClass();
   cout << "The address of x[0] is : " << ( void* )&x[0] << endl;

   // The third form of new delete
   MyClass* fPtr3 = new( nothrow ) MyClass;
   delete fPtr3;
}

может ли кто - нибудь пролить свет на это, и когда и почему вам может понадобиться #include <new> - может быть, какой-то пример кода, который не будет компилироваться без #include <new> ?

спасибо.

4 ответов


ничто в C++ не мешает стандартным заголовкам включать другие стандартные заголовки. Поэтому, если вы включите любой стандартный заголовок, который вы могли бы косвенно включить все из них. Однако это поведение полностью зависит от реализации, и если вам нужны функции определенного заголовка, вы всегда должны явно включать его самостоятельно.


стандартный стих C++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();

эти неявные объявления вводят только имена функций operator new, operator new [], operator delete, operator delete[]. [ Примечание: неявные объявления не вводят имена std, std::bad_alloc и std::size_t или любые другие имена, которые библиотека использует для объявления этих имен. Таким образом, newexpression, delete-expression или вызов функции то, что относится к одной из этих функций без включения заголовка, хорошо сформировано. Однако, ссылаясь на std, std::bad_alloc и std:: size_t неправильно сформирован, если имя не было объявлено, включая соответствующий заголовок. - конец Примечания ]

и std::nothrow версия operator new требует включения заголовка. Стандарт, однако, не указывает неявное включение файлов заголовков в другие файлы заголовков. Так безопасно и портативно следовать стандартный, когда имена std::bad_alloc etc ссылаются.


что касается вопроса в заголовке,

" когда #include <new> библиотека требуется в C++?

ключевое слово new может использоваться различными способами. Обычное использование не требует включения каких-либо заголовков. Но один из возможных способов использования этого ключевого слова-вызвать конкретную функцию "placement new", определенную <new> заголовок. С помощью этого использования вам нужно прямо или косвенно включить <new> заголовок. Не включать заголовок или любой другой заголовок, если он вам не нужен; не включайте заголовки по умолчанию. С другой стороны, не полагайтесь на реализацию конкретной версии заголовка, включая другой: всегда включайте то, что вам нужно в соответствии со стандартными (или другими) спецификациями того, что они предоставляют.

что касается вопроса в организме,

" пример, похоже, компилируется и запускается точно так же для меня без этого включения?

In Заголовки стандартных библиотек C++ могут включать другие заголовки стандартных библиотек (или материал, предоставляемый другими заголовками стандартных библиотек) по усмотрению реализации.


оператор new определена в закидываем bad_alloc исключение (которое объявлено в том же заголовке) вместо возврата NULL, когда выделение памяти невозможно. <new> заголовок также определяет

void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();

вариант, который не выбрасывает исключения и размещение нового варианта. без <new> вы получаете только простой старый, NULL-returning operator new. Все три перегрузки оператора:

void* operator new (std::size_t size) throw (std::bad_alloc);
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
void* operator new (std::size_t size, void* ptr) throw();

объявляется в