#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, static_cast(iter->second.size())); ++i) { printf("%p, ", reinterpret_cast(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); }