Suppose I need to overload global ::operator new()
for storing extra data with each allocated object. So basically it would work this way:
- for each call to global
::operator new()
it will take the object size passed and add the size of extra data
- it will allocate a memory block of size deduced at previous step
- it will offset the pointer to the part of the block not occupied with extra data and return that offset value to the caller
::operator delete()
will do the same in reverse - shift the pointer, access extra data, deallocate memory.
Now the question is how do I allocate memory? Of course I can call malloc()
or some platform-specific function (that's how it is usually done). But normally when I need to allocate raw memory in C++ I call ::operator new()
. Can I call the original ::operator new()
to do the memory allocation from inside my overloaded global ::operator new()
?
You can't access them because it isn't really overloading, it's replacement. When you define your own ::operator new
, the old one goes away. That's pretty much that.
Essentially, you need to call malloc
from a custom ::operator new
. Not only that, but also follow the directions in 18.4.1.1/4 to properly handle errors:
Default behavior:
— Executes a loop:
Within the loop, the function first
attempts to allocate the requested
storage. Whether the attempt involves
a call to the Standard C library
function malloc is unspecified.
—
Returns a pointer to the allocated
storage if the attempt is successful.
Otherwise, if the last argument to
set_new_handler() was a null pointer,
throw bad_alloc.
— Otherwise, the
function calls the current new_handler
(18.4.2.2). If the called function
returns, the loop repeats.
— The loop
terminates when an attempt to allocate
the requested storage is successful or
when a called new_handler function
does not return.