From ca97dca6dc705f216778e71ef76fc0f669bc80ed Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Sat, 11 Jun 2011 18:16:00 +0200 Subject: [PATCH] Use references instead of pointers for CModInfo This works fine and reduces the chances of memory leaks. Signed-off-by: Uli Schlachter --- Modules.cpp | 31 +++++++++++-------------------- Modules.h | 18 ++++++++---------- 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/Modules.cpp b/Modules.cpp index f5d26d92..13d255ed 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -817,7 +817,7 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p CString sModPath, sDataPath; bool bVersionMismatch; - CModInfo* Info; + CModInfo Info; if (!FindModPath(sModule, sModPath, sDataPath)) { sRetMsg = "Unable to find module [" + sModule + "]"; @@ -835,11 +835,10 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p return false; } - if ((pUser == NULL) != Info->IsGlobal()) { - delete Info; + if ((pUser == NULL) != Info.IsGlobal()) { dlclose(p); sRetMsg = "Module [" + sModule + "] is "; - sRetMsg += Info->IsGlobal() ? "" : "not "; + sRetMsg += Info.IsGlobal() ? "" : "not "; sRetMsg += "a global module."; return false; } @@ -847,19 +846,17 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p CModule* pModule = NULL; if (pUser) { - pModule = Info->GetLoader()(p, pUser, sModule, sDataPath); + pModule = Info.GetLoader()(p, pUser, sModule, sDataPath); } else { - pModule = Info->GetGlobalLoader()(p, sModule, sDataPath); + pModule = Info.GetGlobalLoader()(p, sModule, sDataPath); } - pModule->SetDescription(Info->GetDescription()); - pModule->SetGlobal(Info->IsGlobal()); + pModule->SetDescription(Info.GetDescription()); + pModule->SetGlobal(Info.IsGlobal()); pModule->SetArgs(sArgs); pModule->SetModPath(CDir::ChangeDir(CZNC::Get().GetCurPath(), sModPath)); push_back(pModule); - delete Info; - bool bLoaded; try { bLoaded = pModule->OnLoad(sArgs, sRetMsg); @@ -955,16 +952,12 @@ bool CModules::GetModInfo(CModInfo& ModInfo, const CString& sModule, CString& sR bool CModules::GetModPathInfo(CModInfo& ModInfo, const CString& sModule, const CString& sModPath, CString& sRetMsg) { bool bVersionMismatch; - CModInfo* Info; - ModHandle p = OpenModule(sModule, sModPath, bVersionMismatch, Info, sRetMsg); + ModHandle p = OpenModule(sModule, sModPath, bVersionMismatch, ModInfo, sRetMsg); if (!p) return false; - if (Info) { - ModInfo = *Info; - } ModInfo.SetName(sModule); ModInfo.SetPath(sModPath); @@ -972,7 +965,6 @@ bool CModules::GetModPathInfo(CModInfo& ModInfo, const CString& sModule, const C ModInfo.SetDescription("--- Version mismatch, recompile this module. ---"); } - delete Info; dlclose(p); return true; @@ -1057,10 +1049,9 @@ CModules::ModDirList CModules::GetModDirs() { } ModHandle CModules::OpenModule(const CString& sModule, const CString& sModPath, bool &bVersionMismatch, - CModInfo*& Info, CString& sRetMsg) { + CModInfo& Info, CString& sRetMsg) { // Some sane defaults in case anything errors out below bVersionMismatch = false; - Info = NULL; sRetMsg.clear(); for (unsigned int a = 0; a < sModule.length(); a++) { @@ -1098,7 +1089,7 @@ ModHandle CModules::OpenModule(const CString& sModule, const CString& sModPath, return NULL; } - typedef CModInfo* (*InfoFP)(); + typedef void (*InfoFP)(CModInfo&); InfoFP ZNCModInfo = (InfoFP) dlsym(p, "ZNCModInfo"); if (!ZNCModInfo) { @@ -1111,7 +1102,7 @@ ModHandle CModules::OpenModule(const CString& sModule, const CString& sModPath, bVersionMismatch = true; sRetMsg = "Version mismatch, recompile this module."; } else { - Info = ZNCModInfo(); + ZNCModInfo(Info); sRetMsg = ""; bVersionMismatch = false; } diff --git a/Modules.h b/Modules.h index 8593a462..df6e6cd9 100644 --- a/Modules.h +++ b/Modules.h @@ -57,14 +57,12 @@ template CGlobalModule* TModLoadGlobal(ModHandle p, extern "C" { \ double ZNCModVersion(); \ double ZNCModVersion() { return VERSION; } \ - CModInfo* ZNCModInfo(); \ - CModInfo* ZNCModInfo() { \ - CModInfo* Info = new CModInfo(); \ - Info->SetDescription(DESCRIPTION); \ - Info->SetGlobal(GLOBAL); \ + void ZNCModInfo(CModInfo& Info); \ + void ZNCModInfo(CModInfo& Info) { \ + Info.SetDescription(DESCRIPTION); \ + Info.SetGlobal(GLOBAL); \ LOADER; \ - TModInfo(*Info); \ - return Info; \ + TModInfo(Info); \ } \ } @@ -96,7 +94,7 @@ template CGlobalModule* TModLoadGlobal(ModHandle p, * @see For global modules you need GLOBALMODULEDEFS. */ #define MODULEDEFS(CLASS, DESCRIPTION) \ - MODCOMMONDEFS(CLASS, DESCRIPTION, false, Info->SetLoader(TModLoad)) + MODCOMMONDEFS(CLASS, DESCRIPTION, false, Info.SetLoader(TModLoad)) // !User Module Macros // Global Module Macros @@ -107,7 +105,7 @@ template CGlobalModule* TModLoadGlobal(ModHandle p, /** This works exactly like MODULEDEFS, but for global modules. */ #define GLOBALMODULEDEFS(CLASS, DESCRIPTION) \ - MODCOMMONDEFS(CLASS, DESCRIPTION, true, Info->SetGlobalLoader(TModLoadGlobal)) + MODCOMMONDEFS(CLASS, DESCRIPTION, true, Info.SetGlobalLoader(TModLoadGlobal)) // !Global Module Macros // Forward Declarations @@ -982,7 +980,7 @@ public: private: static ModHandle OpenModule(const CString& sModule, const CString& sModPath, - bool &bVersionMismatch, CModInfo*& Info, CString& sRetMsg); + bool &bVersionMismatch, CModInfo& Info, CString& sRetMsg); protected: CUser* m_pUser;