9#ifndef TPF_MEMORY_LEAK_DETECT_HPP
10#define TPF_MEMORY_LEAK_DETECT_HPP
25 #define STDSTRING std::wstring
26 #define STRSTREAM std::wostringstream
27 #define UNISTR(txt) L##txt
28 #define UNITXT(txt) UNISTR(#txt)
29 #define STDCOUT std::wcout
31 #define STDSTRING std::string
32 #define STRSTREAM std::ostringstream
33 #define UNISTR(txt) txt
34 #define UNITXT(txt) UNISTR(#txt)
35 #define STDCOUT std::cout
38#if !defined(_WINDOWS) && !defined(_AFXDLL)
43 #define _CRTDBG_MAP_ALLOC
48 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
62 m_filename(filename), m_lineno(lineno), m_varname(varname), m_total(0)
70 _CrtMemState mem_state;
71 _CrtMemCheckpoint(&mem_state);
72 this->m_total = mem_state.lSizes[_NORMAL_BLOCK];
77 _CrtMemState mem_state;
78 _CrtMemCheckpoint(&mem_state);
80 return mem_state.lSizes[_NORMAL_BLOCK] - this->m_total;
83 STDSTRING Message(
int lineno = 0,
bool from_destructor=
false)
85 size_t bytes = Difference();
91 stm <<
UNISTR(
"File: ") << m_filename <<
UNISTR(
"\nAt line: ") << (lineno ? lineno : m_lineno)
92 <<
UNISTR(
", Checkpoint: ") << m_varname <<
UNISTR(
", ") << bytes
93 << (from_destructor ?
UNISTR(
" bytes LEAKED.") :
UNISTR(
" bytes ALIVE."));
97 stm <<
UNISTR(
"Memory State CLEAN.");
103 void Report(
int lineno = 0,
bool from_destructor=
false)
110 if (Difference() > 0) { Report(0,
true); }
115 #define MemLeakCheckReport(varname) varname.Report(__LINE__)
116 #define MemLeakCheckMessage(varname) varname.Message(__LINE__)
126 #define new DEBUG_NEW
137 CMemoryState mem_state;
140 CMemLeakCheck(
const CString& filename=
UNISTR(
""),
141 int lineno=0,
const CString& varname=
UNISTR(
"")) :
142 m_filename(filename), m_lineno(lineno), m_varname(varname), m_total(0)
150 mem_state.Checkpoint();
151 this->m_total = mem_state.m_lSizes[_NORMAL_BLOCK];
156 mem_state.Checkpoint();
157 return (mem_state.m_lSizes[_NORMAL_BLOCK]) - this->m_total;
165 Message(
int lineno=0,
bool from_destructor=
false)
167 size_t bytes = Difference();
174 stm <<
UNISTR(
"File: ") << m_filename.GetString() <<
UNISTR(
"\nAt line: ") << (lineno ? lineno : m_lineno)
175 <<
UNISTR(
", Checkpoint: ") << m_varname.GetString() <<
UNISTR(
", ") << bytes <<
176 (from_destructor ?
UNISTR(
" bytes LEAKED.") :
UNISTR(
" bytes are ALIVE."));
180 stm <<
UNISTR(
"Memory Clean.");
189 return CString(stm.str().c_str());
193 void Report(
int lineno = 0,
bool from_destructor=
false)
199 CString msg = Message(lineno, from_destructor);
206 if (Difference() > 0) { Report(0,
true); }
210 #define MemLeakCheckReport(varname) varname.Report(__LINE__)
211 #define MemLeakCheckMessage(varname) varname.Message(__LINE__)
222 #define Tpf_MemLeakCheck(varname) CMemLeakCheck varname(__FILEW__, __LINE__, UNITXT(varname)) ; varname.Reset()
224 #define Tpf_MemLeakCheck(varname) CMemLeakCheck varname(__FILE__, __LINE__, UNITXT(varname)) ; varname.Reset()
227 #define Tpf_MemLeakCheckReport(varname) varname.Report(__LINE__)
228 #define Tpf_MemLeakCheckMessage(varname) varname.Message(__LINE__)
231 #define Tpf_MemLeakCheck(varname)
232 #define Tpf_MemLeakCheckReport(varname)
233 #define Tpf_MemLeakCheckMessage(varname)