Search code examples
c++operator-overloadingnew-operatordelete-operator

How to obtain the source location in an overload of operator new


I'm making a little memory leak finder in my program, but my way of overloading new and delete (and also new[] and delete[]) doesn't seem to do anything.

void* operator new (unsigned int size, const char* filename, int line)
{
    void* ptr = new void[size];
    memleakfinder.AddTrack(ptr,size,filename,line);
    return ptr;
}

The way I overloaded new is shown in the code snippet above. I guess it's something with the operator returning void* but I do not know what to do about it.


Solution

  • void* ptr = new void[size];
    

    Can't do that. Fix it.

    Never ever try to overload new/delete globally. Either have them in a base class and derive all your objects from this class or use a namespace or a template allocator parameter. Why, you may ask. Because in case your program is more than a single file and using STL or other libraries you are going to screw up.

    Here's a distilled version of new operator from VS2005 new.cpp:

    void * operator new(size_t size) _THROW1(_STD bad_alloc)
    {       // try to allocate size bytes
       void *p;
       while ((p = malloc(size)) == 0)
        if (_callnewh(size) == 0)
         {       // report no memory
            static const std::bad_alloc nomem;
            _RAISE(nomem);
         }
    
         return (p);
    }