From 210b5c295d601ffea7acdb3a7505e0102571bc6f Mon Sep 17 00:00:00 2001 From: krzys-h Date: Sun, 24 Jul 2016 22:51:41 +0200 Subject: [PATCH] Fix memory leak related to performance counters This commit actually fixes two problems causing the leak: * DestroyTimeStamp not being called in CProfiler (my stupid mistake in 5fea22ff03f3da5ee27be4039205010c203a8c23) * DestroyTimeStamp leaving null pointers in CSystemUtils::m_timeStamps (this was introduced by @piotrdz long ago when introducing smart pointers) --- src/common/profiler.cpp | 2 ++ src/common/system/system.cpp | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/common/profiler.cpp b/src/common/profiler.cpp index f94a92ec..f80ae849 100644 --- a/src/common/profiler.cpp +++ b/src/common/profiler.cpp @@ -53,6 +53,8 @@ void CProfiler::StopPerformanceCounter(PerformanceCounter counter) SystemTimeStamp* timeStamp = m_systemUtils->CreateTimeStamp(); m_systemUtils->GetCurrentTimeStamp(timeStamp); m_performanceCounters[counter] += m_systemUtils->TimeStampExactDiff(m_runningPerformanceCounters.top(), timeStamp); + m_systemUtils->DestroyTimeStamp(timeStamp); + m_systemUtils->DestroyTimeStamp(m_runningPerformanceCounters.top()); m_runningPerformanceCounters.pop(); if (counter == PCNT_ALL) diff --git a/src/common/system/system.cpp b/src/common/system/system.cpp index 210b4a75..ce594ea7 100644 --- a/src/common/system/system.cpp +++ b/src/common/system/system.cpp @@ -36,6 +36,7 @@ #include #include +#include std::unique_ptr CSystemUtils::Create() @@ -152,11 +153,7 @@ SystemTimeStamp* CSystemUtils::CreateTimeStamp() void CSystemUtils::DestroyTimeStamp(SystemTimeStamp *stamp) { - for (auto& timeStamp : m_timeStamps) - { - if (timeStamp.get() == stamp) - timeStamp.reset(); - } + m_timeStamps.erase(std::remove_if(m_timeStamps.begin(), m_timeStamps.end(), [&](const std::unique_ptr& timeStamp) { return timeStamp.get() == stamp; })); } void CSystemUtils::CopyTimeStamp(SystemTimeStamp *dst, SystemTimeStamp *src)