* Shark:
Hi, if we need to change the behavior of operator new, it is called
overriding or overloading?
operator new is a static function, and on that account it would be
'overload'.
However, operator delete is also a static function, but behaves much like a
virtual function with dynamic (run-time) dispatch:
#include <iostream>
#include <ostream>
#include <memory>
struct Base { virtual ~Base() {} };
struct DerivedA: Base
{
static void operator delete( void* p )
{
std::cout << "Deallocating A." << std::endl;
:
perator delete( p );
}
};
struct DerivedB: Base
{
static void operator delete( void* p )
{
std::cout << "Deallocating B." << std::endl;
:
perator delete( p );
}
};
int main()
{
std::auto_ptr<Base> pA( new DerivedA );
std::auto_ptr<Base> pB( new DerivedB );
}
which yields the output
Deallocating B.
Deallocating A.
as if operator delete were a virtual function.
So in the case of operator delete it's not entirely inappropriate to talk
about 'override'.
What about operator new then, viewed as a kind of same sort of function as
operator delete?
Well, it isn't. Operator new is more like a constructor (you don't override
constructors, and you don't override operator new), and operator delete is
more like a virtual destrutor (you do override virtual destructors).
My other question is, if we change the
behavior of operator new, do we use malloc to do that or we use
operator new?
You can use anything you want, it depends on what you want. But given that
you ask, i.e. not sure, my advice would be to _not_ overload operator new.
Except as a learning experiment -- don't use features you don't understand
in production code, especially not dangerous, low-level features.