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