I was noticing there were some memory leaks inside the board/module classes that got somewhat extreme in some cases (I saw ~300MB leaked from opening and closing cvpcb in Eeschema when run without a project manager). This patch adds some deletion to the destructors of the board/module classes, so they now will delete their sub items.
I believe these classes are the respective owners of those pointers to the sub items, and my testing doesn't show any problems with this, but if anyone can see a case where deleting these sub items on destruction might be an issue, let me know. -Ian
From 93959c0c51f7a19ceb45c63d274888feb0107e2a Mon Sep 17 00:00:00 2001 From: Ian McInerney <ian.s.mciner...@ieee.org> Date: Sun, 11 Aug 2019 22:30:33 +0200 Subject: [PATCH] Fix some memory leaks Some elements of modules and boards were not deleted, so memory was being leaked on some library loads and single-instance pcbnew usage. --- kicad/kicad_manager_frame.cpp | 7 +++++++ pcbnew/class_board.cpp | 19 +++++++++++++++++++ pcbnew/class_module.cpp | 11 +++++++++++ 3 files changed, 37 insertions(+) diff --git a/kicad/kicad_manager_frame.cpp b/kicad/kicad_manager_frame.cpp index 2ff4df65e..9ea194849 100644 --- a/kicad/kicad_manager_frame.cpp +++ b/kicad/kicad_manager_frame.cpp @@ -165,6 +165,13 @@ KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& titl KICAD_MANAGER_FRAME::~KICAD_MANAGER_FRAME() { + // Ensure there are no active tools + if( m_toolManager ) + m_toolManager->DeactivateTool(); + + delete m_actions; + delete m_toolManager; + m_auimgr.UnInit(); } diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index bc640f218..0dbe59020 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -146,9 +146,28 @@ BOARD::~BOARD() Delete( area_to_remove ); } + // Clean up the owned elements DeleteMARKERs(); DeleteZONEOutlines(); + // Delete the modules + for( auto m : m_modules ) + delete m; + + m_modules.clear(); + + // Delete the tracks + for( auto t : m_tracks ) + delete t; + + m_tracks.clear(); + + // Delete the drawings + for (auto d : m_drawings ) + delete d; + + m_drawings.clear(); + delete m_CurrentZoneContour; m_CurrentZoneContour = NULL; } diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index 9fa8405eb..84326ef64 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -142,9 +142,20 @@ MODULE::MODULE( const MODULE& aModule ) : MODULE::~MODULE() { + // Clean up the owned elements delete m_Reference; delete m_Value; delete m_initial_comments; + + for( auto p : m_pads ) + delete p; + + m_pads.clear(); + + for( auto d : m_drawings ) + delete d; + + m_drawings.clear(); } -- 2.21.0
_______________________________________________ Mailing list: https://launchpad.net/~kicad-developers Post to : kicad-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~kicad-developers More help : https://help.launchpad.net/ListHelp