I know new
and delete
are keywords.
int obj = new int;
delete obj;
int* arr = new int[1024];
delete[] arr;
<new>
header is a part of C++ standard headers. It has two operators (I am not sure they are operators or they are functions):
::operator new
::operator delete
these operators used like below:
#include <new>
using namespace std;
int* buff = (int*)::operator new(1024 * sizeof(int));
::operator delete(buff);
What are "::operator new" and "::operator delete"? Are they different from new
and delete
keywords?
::
tells the compiler to call the operators defined in global namespace.It is the fully qualified name for the global
new
anddelete
operators.Note that one can replace the global
new
anddelete
operators as well as overload class-specificnew
anddelete
operators. So there can be two versions ofnew
anddelete
operators in an program. The fully qualified name with the scope resolution operator tells the compiler you are referring to the global version of the operators and not the class-specific ones.the
new
keyword (used alone) is not the same as theoperator new
function.Calling
is equvalent in calling
The operator new (or better the
void* operator new(size_t)
variant) just allocate memory, but does not do any object construction.The
new
keyword calls the operator new function, but then calls the object constructor.To separate allocation from contruction, a variant of operator new is declared as
and the previous code is typically written as
The
operator new(size_t, void*)
does nothing in itself, but, being invoked by the keyword will result in the contructor being called.Reversely, destruction and deallocation can be separated with
instead of
delete p
; that calls the destructor and thenoperator delete(void*)
.::
means just a global namespaceThey are allocator and deallocator functions. The
new
operator does two things: it calls an allocator function to get the memory, and it calls the constructor of the object. Thedelete
operator also does two things: it calls the destructor, and then calls the a deallocator function. The default allocator function is::operator new
, and the default deallocator function is::operator delete
. Both can be replaced by the user.Note that in a new expression, the
::operator new
function is looked up in more or less the same manner as it would be if it were a normal function called from within a member function. As for normal functions, you can qualify the operator to change the lookup:new MyClass
will find a memberoperator new
if one is present;::new MyClass
will use the default allocator, even ifMyClass
defines a memberoperator new
.