#include "leaktrace.h" #include "stackdata.h" #include #include #include #include #include #include #include using namespace MOShared; static struct __TraceData { void regTrace(void *pointer, const char *functionName, int line) { m_Traces[reinterpret_cast(pointer)] = StackData(functionName, line); } void deregTrace(void *pointer) { auto iter = m_Traces.find(reinterpret_cast(pointer)); if (iter != m_Traces.end()) { m_Traces.erase(iter); } } ~__TraceData() { std::map > result; for (auto iter = m_Traces.begin(); iter != m_Traces.end(); ++iter) { result[iter->second].push_back(iter->first); } for (auto iter = result.begin(); iter != result.end(); ++iter) { printf("-----------------------------------\n" "%d objects not freed, allocated at:\n%s", iter->second.size(), iter->first.toString().c_str()); printf("Addresses: "); for (int i = 0; i < (std::min)(5, iter->second.size()); ++i) { printf("%p, ", iter->second[i]); } printf("\n"); } } std::map m_Traces; } __trace; void LeakTrace::TraceAlloc(void *ptr, const char *functionName, int line) { __trace.regTrace(ptr, functionName, line); } void LeakTrace::TraceDealloc(void *ptr) { __trace.deregTrace(ptr); }