From f9d12fb872374e1ade8e65a8ff66cf9a10f27d36 Mon Sep 17 00:00:00 2001 From: psychon Date: Mon, 24 Mar 2008 22:24:15 +0000 Subject: [PATCH] Fix a memory leak in CUser::Clone() Clone() didn't free the list of servers, but instead just leaked it. This introduces CUser::DelServers() for simplicity. The reordering in the destructor is to fix some theoretical bugs (I bet someone will hate me for this). git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@993 726aef4b-f618-498e-8847-2d620e286838 --- User.cpp | 25 ++++++++++++++++--------- User.h | 1 + 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/User.cpp b/User.cpp index 223d3cf3..3eaeb25e 100644 --- a/User.cpp +++ b/User.cpp @@ -60,20 +60,18 @@ CUser::CUser(const CString& sUserName) { } CUser::~CUser() { - for (unsigned int a = 0; a < m_vServers.size(); a++) { - delete m_vServers[a]; - } - - for (unsigned int b = 0; b < m_vChans.size(); b++) { - delete m_vChans[b]; - } - DelClients(); #ifdef _MODULES DelModules(); #endif + DelServers(); + + for (unsigned int b = 0; b < m_vChans.size(); b++) { + delete m_vChans[b]; + } + CZNC::Get().GetManager().DelCronByAddr(m_pKeepNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pJoinTimer); CZNC::Get().GetManager().DelCronByAddr(m_pMiscTimer); @@ -97,6 +95,15 @@ void CUser::DelClients() { m_vClients.clear(); } +void CUser::DelServers() +{ + for (unsigned int a = 0; a < m_vServers.size(); a++) { + delete m_vServers[a]; + } + + m_vServers.clear(); +} + void CUser::IRCConnected(CIRCSock* pIRCSock) { for (unsigned int a = 0; a < m_vClients.size(); a++) { m_vClients[a]->IRCConnected(pIRCSock); @@ -334,7 +341,7 @@ bool CUser::Clone(const CUser& User, CString& sErrorRet) { sServer = pCurServ->GetName(); } - m_vServers.clear(); + DelServers(); for (a = 0; a < vServers.size(); a++) { CServer* pServer = vServers[a]; diff --git a/User.h b/User.h index 925598ce..d28cdba4 100644 --- a/User.h +++ b/User.h @@ -58,6 +58,7 @@ public: bool ConnectPaused(); void DelClients(); + void DelServers(); #ifdef _MODULES void DelModules();