Debug-friendly New and Delete

For better handling of resource leaks, try “marking” the allocation with ancillary information:

#include #include #include #include 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 << "
";	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 << "
";	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;}
Share the Post:
Share on facebook
Share on twitter
Share on linkedin


Recent Articles: