diff --git a/User.cpp b/User.cpp index 9a807f1a..f0f4370e 100644 --- a/User.cpp +++ b/User.cpp @@ -45,9 +45,6 @@ CUser::CUser(const CString& sUserName) { } CUser::~CUser() { -#ifdef _MODULES - delete m_pModules; -#endif for (unsigned int a = 0; a < m_vServers.size(); a++) { delete m_vServers[a]; } @@ -56,9 +53,8 @@ CUser::~CUser() { delete m_vChans[b]; } - for (unsigned int c = 0; c < m_vClients.size(); c++) { - CZNC::Get().GetManager().DelSockByAddr(m_vClients[c]); - } + DelClients(); + DelModules(); CZNC::Get().GetManager().DelCronByAddr(m_pBackNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pAwayNickTimer); @@ -66,6 +62,24 @@ CUser::~CUser() { CZNC::Get().GetManager().DelCronByAddr(m_pJoinTimer); } +#ifdef _MODULES +void CUser::DelModules() { + if (m_pModules) { + delete m_pModules; + m_pModules = NULL; + } +} +#endif + +void CUser::DelClients() { + for (unsigned int c = 0; c < m_vClients.size(); c++) { + CClient* pClient = m_vClients[c]; + CZNC::Get().GetManager().DelSockByAddr(pClient); + } + + m_vClients.clear(); +} + bool CUser::OnBoot() { #ifdef _MODULES return GetModules().OnBoot(); diff --git a/User.h b/User.h index 032a5fa5..b0a6479c 100644 --- a/User.h +++ b/User.h @@ -51,6 +51,11 @@ public: bool IsLastServer(); bool ConnectPaused(); + void DelClients(); +#ifdef _MODULES + void DelModules(); +#endif + #ifdef _MODULES // Modules CModules& GetModules() { return *m_pModules; } diff --git a/znc.cpp b/znc.cpp index 1d4a1f76..4a748af9 100644 --- a/znc.cpp +++ b/znc.cpp @@ -84,6 +84,10 @@ int CZNC::Loop() { m_Manager.DelSockByAddr(pIRCSock); } + pUser->DelClients(); +#ifdef _MODULES + pUser->DelModules(); +#endif delete pUser; } @@ -249,7 +253,7 @@ void CZNC::DeleteUsers() { } m_msUsers.clear(); - m_itUserIter = m_msUsers.end(); + m_itUserIter = m_msUsers.begin(); } CUser* CZNC::GetUser(const CString& sUser) {