Когда требуется библиотека #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();
объявляется в