According to this reference for operator new
:
Global dynamic storage operator functions are special in the standard library:
- Al
The C++ Standard verse 3.7.4.2 says :-
The library provides default definitions for the global allocation and deallocation functions. Some global allocation and deallocation functions are replaceable (18.6.1). A C++ program shall provide at most one definition of a replaceable allocation or deallocation function. Any such function definition replaces the default version provided in the library (17.6.3.6). The following allocation and deallocation functions (18.6) are implicitly declared in global scope in each translation unit of a program.
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();
These implicit declarations introduce only the function names
operator new
,operator new[]
,operator delete
,operator delete[]
. [ Note: the implicit declarations do not introduce the namesstd
,std::bad_alloc
, andstd::size_t
, or any other names that the library uses to declare these names. Thus, a new-expression, delete-expression or function call that refers to one of these functions without including the header<new>
is well-formed. However, referring tostd
,std::bad_alloc
, andstd::size_t
is ill-formed unless the name has been declared by including the appropriate header. —end note]
Also, the std::nothrow
version of the operator new
requires the inclusion of the header (example).
The standard though does not specify implicit inclusion of the header files within other header files. So it is safe and portable to follow the standard when the names std::bad_alloc
etc are referred.
Operator new
defined in <new>
header throws bad_alloc
exception (which is declared in the same header) instead of returning NULL when memory allocation is not possible. <new>
header also defines
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
variant which does not throw exceptions and placement new variant. Without . All three operator overloads:<new>
you get only plain old, 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();
are declared in <new>
header. However, some compilers may make them available implicitly, but this is non-standard, and you should not rely on it.
Nothing in C++ prevents standard headers from including other standard headers. So if you include any standard header you might conceivably indirectly include all of them. However, this behaviour is totally implementation dependent, and if you need the features of a specific header you should always explicitly include it yourself.
Regarding the question in the title,
” When is
#include <new>
library required in C++?
The keyword new
can be used in various ways. Ordinary use does not require inclusion of any headers. But one possible way to use this keyword is to invoke the particular “placement new” function defined by the <new>
header. With that usage you need to directly or indirectly include the <new>
header. Do not include that header, or any other header, unless you need it; do not include headers by default. On the other hand, do not rely on an implementation specific version of a header including another one: always include what you need as per the standard's (or other) specifications of what they provide.
Regarding the question in the body,
” the example seems to compile and run just the same for me without this include?
In C++ standard library headers are permitted to include other standard library headers (or the stuff provided by other standard library headers), at the implementation's discretion.