operator new override/overload?

S

Shark

Hi, if we need to change the behavior of operator new, it is called
overriding or overloading? My other question is, if we change the
behavior of operator new, do we use malloc to do that or we use
operator new?
 
F

Fred Zwarts

Shark said:
Hi, if we need to change the behavior of operator new, it is called
overriding or overloading? My other question is, if we change the
behavior of operator new, do we use malloc to do that or we use
operator new?

It is not clear what you want. C++ has several operators new. Which one do you need to change?
C++ has the possibility to define a new operator for a class. This is the safest way to go.
It is also possible to override the global new operators, but this needs a lot of care,
since these global new operators are also used in the C++ library functions.
(This means that on many platforms the standard operator new sits already in the shareable libraries,
so you should use a static link to get a consistent use of the changed new operators.)
In addition you should change the delete operators as well to match your new operators.
You could use malloc and free.

F.Z.
 
A

Alf P. Steinbach

* 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;
::eek:perator delete( p );
}
};

struct DerivedB: Base
{
static void operator delete( void* p )
{
std::cout << "Deallocating B." << std::endl;
::eek: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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top