I'm using c::b 13.12, there is a memory leak at ProjectManagerUI::BuildProjectTree:
void ProjectManagerUI::BuildProjectTree(cbProject* project, cbTreeCtrl* tree, const wxTreeItemId& root, int ptvs, FilesGroupsAndMasks* fgam)
{
....
// Now add any virtual folders
const wxArrayString& virtualFolders = project->GetVirtualFolders();
for (size_t i = 0; i < virtualFolders.GetCount(); ++i)
{
ftd = new FileTreeData(project, FileTreeData::ftdkVirtualFolder);
ftd->SetFolder(virtualFolders);
ProjectAddTreeNode(project, tree, virtualFolders, project->GetProjectNode(), true,
FileTreeData::ftdkVirtualFolder, true, vfldIdx, ftd);
}
.....
}
in the function ProjectAddTreeNode, it allocates a new ftd and copy the content.
so the ftd pointer here will cause a memory leak.
wxTreeItemId ProjectAddTreeNode(cbProject *project, wxTreeCtrl* tree, const wxString& text, const wxTreeItemId& parent,
bool useFolders, FileTreeData::FileTreeDataKind folders_kind, bool compiles, int image,
FileTreeData* data)
{
.....
if (useFolders && pos >= 0)
{
.........
if (!newparent)
{
// in order not to override wxTreeCtrl to sort alphabetically but the
// folders be always on top, we just search here where to put the new folder...
int fldIdx = cbProjectTreeImages::FolderIconIndex();
int vfldIdx = cbProjectTreeImages::VirtualFolderIconIndex();
newparent = ProjectFindNodeToInsertAfter(tree, folder, parent, true);
FileTreeData* ftd = new FileTreeData(*data);
ftd->SetKind(folders_kind);
if (folders_kind != FileTreeData::ftdkVirtualFolder)
ftd->SetFolder(project->GetCommonTopLevelPath() + GetRelativeFolderPath(tree, parent) + folder + wxFILE_SEP_PATH);
else
ftd->SetFolder(GetRelativeFolderPath(tree, parent) + folder + wxFILE_SEP_PATH);
ftd->SetProjectFile(nullptr);
int idx = folders_kind != FileTreeData::ftdkVirtualFolder ? fldIdx : vfldIdx;
newparent = tree->InsertItem(parent, newparent, folder, idx, idx, ftd);
}
ret = ProjectAddTreeNode(project, tree, path, newparent, true, folders_kind, compiles, image, data);
}
.......
}