You can easily perform the check in your overloaded new operator. Be sure to implement all flavours of the new operator (as AProgrammer already pointed out).
Calling the original/default new is not possible, but it's not difficult to implement it yourself. After all, new only allocates memory, that's it. So instead of calling the original/default new, you can also call malloc, HeapAlloc, or any memory-allocation routine found on your system. Be sure to call the corresponding memory-deallocation method (free, HeapFree, ...) in your implementation of delete.
You didn't tell what kind of condition you are going to check in your implementation of new? If it's a 'static' condition (I mean: always giving the same result during the execution of your application), the same condition should also be added to your implementation of delete.
If the condition depends on the situation and changes while running your application, you should foresee a method where you can know which delete implementation to use in your delete function. One trick do to this is the following:
In your implementation of new:
- allocate 8 bytes more than requested (this must be 8 bytes to keep the alignment correct)
- fill in the first 8 bytes with an identification so that you can know which underlying memory-allocation function you used
- add 8 bytes to the allocated pointer and return this one
In your implementation of delete:
- subtract 8 bytes of the pointer given to you
- check the identification found at that place (see new) to see which kind of underlying delete-implementation you should call