How do I call the original “operator new” if I hav

2019-01-06 17:34发布

问题:

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()?

回答1:

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.