in the release code of 12.11
void CompilerGCC::PrepareCompileFilePM(wxFileName& file)
{
// we 're called from a menu in ProjectManager
// let's check the selected project...
[color=red]FileTreeData* ftd = DoSwitchProjectTemporarily();[/color]
ProjectFile* pf = ftd->GetProjectFile();
if (!pf)
return;
file = pf->file;
CheckProject();
}
the ftd pointer here is malloc in DoSwitchProjectTemporarily function, but no use here, so it MUST be deleted, or it will result in a memory leak!
Please check if this problem exists in the SVN sources and report back. Almost no one here is interested in 12.11 any more!
this bug still exists at 13.12.
everywhere call the DoSwitchProjectTemporarily function will cause a memory leak!! :'(
Quote from: lights_joy on January 22, 2014, 02:36:27 PM
this bug still exists at 13.12.
everywhere call the DoSwitchProjectTemporarily function will cause a memory leak!! :'(
Please read this other thread you started!
http://forums.next.codeblocks.org/index.php/topic,18756.msg128544.html#msg128544 (http://forums.next.codeblocks.org/index.php/topic,18756.msg128544.html#msg128544)
This patch should fix the problem. I'll wait for a few day and if there are no objections I'll commit it.
Index: src/plugins/compilergcc/compilergcc.cpp
===================================================================
--- src/plugins/compilergcc/compilergcc.cpp (revision 9609)
+++ src/plugins/compilergcc/compilergcc.cpp (working copy)
@@ -1073,16 +1073,14 @@ FileTreeData* CompilerGCC::DoSwitchProjectTemporarily()
ProjectManager* manager = Manager::Get()->GetProjectManager();
wxTreeCtrl* tree = manager->GetUI().GetTree();
wxTreeItemId sel = manager->GetUI().GetTreeSelection();
- FileTreeData* ftd = sel.IsOk() ? (FileTreeData*)tree->GetItemData(sel) : 0;
+ FileTreeData* ftd = sel.IsOk() ? (FileTreeData*)tree->GetItemData(sel) : nullptr;
if (!ftd)
- return 0L;
- // copy ftd to a new instance, because after the SetProject() call
- // that follows, ftd will no longer be valid...
- FileTreeData* newFtd = new FileTreeData(*ftd);
+ return nullptr;
+ // We're not rebuilding the tree, so the ftd pointer is still valid after the call.
Manager::Get()->GetProjectManager()->SetProject(ftd->GetProject(), false);
AskForActiveProject();
- return newFtd;
+ return ftd;
}
void CompilerGCC::AddToCommandQueue(const wxArrayString& commands)