For better handling of resource leaks, try "marking" the allocation with ancillary information:
#include <malloc.h>
#include <assert.h>
#include <stddef.h>
#include <iostream.h>
typedef void FDEL(void* p, size_t size);
typedef FDEL* PFDEL;
class A
{
int a;
static void sfree(void* p, size_t size);
static void sfreedebug(void* p, size_t size);
public:
virtual ~A() {}
void* operator new(size_t size);
void operator delete(void* p, size_t size);
void* operator new(size_t size, char* Tag);
};
void A::operator delete(void* p, size_t size)
{
char* pb = (char*) p;
pb -= sizeof(PFDEL);
PFDEL pfdel = *(PFDEL*)pb;
(*pfdel)(pb, size);
}
void A::sfree(void* p, size_t size)
{
free(p);
}
void* A::operator new(size_t size)
{
char* pb = (char*) malloc(size + sizeof(PFDEL));
*(PFDEL*)pb = &sfree
return (pb + sizeof(PFDEL));
}
struct DEBUGHDR
{
size_t size;
char* Tag;
PFDEL pfdel;
};
void A::sfreedebug(void* p, size_t size)
{
char* pb = (char*) p;
pb += (sizeof(PFDEL) - sizeof(DEBUGHDR));
DEBUGHDR* phdr = (DEBUGHDR*) pb;
assert(size == phdr->size);
cout << "freeing " << phdr->size
<< " For class " << phdr->Tag << "\n";
free(pb);
}
void* A::operator new(size_t size, char* inTag)
{
char* pb = (char*) malloc(size + sizeof(DEBUGHDR));
DEBUGHDR* phdr = (DEBUGHDR*) pb;
phdr->size = size;
phdr->Tag= Tag;
phdr->pfdel = &sfreedebug
cout << "new'ing " << phdr->size
<< " For class" << phdr->Tag << "\n";
return (pb + sizeof(DEBUGHDR));
}
class B : public A
{
double b;
};
main()
{
A* pa1 = new A;
B* pb1 = new B;
A* pa2 = new("A") A;
B* pb2 = new("B") B;
delete pa1;
delete pb1;
delete pa2;
delete pb2;
return 0;
}