Login | Register   
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: C++
Expertise: Intermediate
Jun 28, 2006

Debug-friendly New and Delete

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;
}
Ramanjaneyulu Malisetti
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap