Макроопределение 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.
......