Шаг 228 - DEBUG_NEW

Макроопределение DEBUG_NEW предназначенно для выявления утечки памяти. Этого вопроса мы уже не раз касались. Смотрите "Шаг 65 - Ловим утечку памяти" и "Подробности - Утечка памяти". Здесь Вы можете узнать, что это за понятие "утечка памяти". Мы же с Вами займемся стандартным решением на основе DEBUG_NEW.

#define new DEBUG_NEW 

В результате переопределения new мы добавляем к обычному оператору new информацию о файле и строке. Вот как это выглядит в исходном коде.

#define DEBUG_NEW new(THIS_FILE, __LINE__)

Естественно, что пользоваться этим нужно в отладочной версии и поэтому разумно делать так четко подчеркивая, что это отладочный Вариант. Это делать не обязательно, так как в версии RELEASE все равно заменится на обычный new, но зато понятно. Это только для отладки !!!

#ifdef _DEBUG
	#define new DEBUG_NEW 
#endif

Сформировав так информацию ее можно получить вызвав функцию DumpAllObjectsSince, которая вернет информацию о каждом файле и строке где распределена память с использованием DEBUG_NEW. Вы конечно и без DEBUG_NEW можете получить информацию о утечке, но только более сжатую о чем было ранее написано в шагах. Давайте посмотрим.

#include "stdafx.h"
#include "afxwin.h"
#include "iostream.h"

#ifdef _DEBUG
	#define new DEBUG_NEW
#endif

class CMyObject : public CObject
{
public:
	#ifdef _DEBUG
		void AssertValid() const;
		void Dump(CDumpContext& dc) const;
	#endif
	void Serialize( CArchive& ar );
protected:
    DECLARE_SERIAL(CMyObject);
private:
	int x;
	int y;
};

void CMyObject::Serialize( CArchive& ar )
{
	CObject::Serialize( ar );
	if( ar.IsStoring() )
		ar << x;
	else
		ar >> x;
}

IMPLEMENT_SERIAL(CMyObject,CObject,1);

#ifdef _DEBUG

void CMyObject::AssertValid() const
{
	CObject::AssertValid();
	ASSERT(y==100);
}

void CMyObject::Dump( CDumpContext& dc ) const
{
	CObject::Dump(dc);
	dc << "Hello Dump ";
}
#endif

void main()
{
	CMyObject *cm;
	cm=new CMyObject;
}

В результате запуска в отладочном окне мы видим вот что.

......
Detected memory leaks!	// Утечка памяти !!!
Dumping objects ->		// в файле  TestObject.cpp на строке 67 выделена память которая не удалена
E:\PROJECT\TestObject\TestObject.cpp(67) : {19} client block at 0x008A0E90, subtype 0, 12 bytes long.
a CMyObject object at $008A0E90, 12 bytes long // 
Object dump complete.
......

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.08.2000