Free allocated DRC structures when re-initializing.

Fixes https://gitlab.com/kicad/code/kicad/issues/6147
This commit is contained in:
Jeff Young 2020-10-24 22:16:07 +01:00
parent 346b7178b7
commit 7674d2ba91
3 changed files with 29 additions and 6 deletions

View File

@ -70,6 +70,17 @@ DRC_ENGINE::DRC_ENGINE( BOARD* aBoard, BOARD_DESIGN_SETTINGS *aSettings ) :
DRC_ENGINE::~DRC_ENGINE()
{
for( DRC_RULE* rule : m_rules )
delete rule;
for( std::pair< DRC_CONSTRAINT_TYPE_T,
std::vector<CONSTRAINT_WITH_CONDITIONS*>* > pair : m_constraintMap )
{
for( CONSTRAINT_WITH_CONDITIONS* constraintWithCondition : *pair.second )
delete constraintWithCondition;
delete pair.second;
}
}
@ -484,9 +495,8 @@ void DRC_ENGINE::loadRules( const wxFileName& aPath )
void DRC_ENGINE::compileRules()
{
ReportAux( wxString::Format( "Compiling Rules (%d rules, %d conditions): ",
(int) m_rules.size(),
(int) m_ruleConditions.size() ) );
ReportAux( wxString::Format( "Compiling Rules (%d rules): ",
(int) m_rules.size() ) );
for( DRC_TEST_PROVIDER* provider : m_testProviders )
{
@ -569,10 +579,23 @@ void DRC_ENGINE::InitEngine( const wxFileName& aRulePath )
provider->SetDRCEngine( this );
}
m_ruleConditions.clear();
for( DRC_RULE* rule : m_rules )
delete rule;
m_rules.clear();
m_rulesValid = false;
for( std::pair< DRC_CONSTRAINT_TYPE_T,
std::vector<CONSTRAINT_WITH_CONDITIONS*>* > pair : m_constraintMap )
{
for( CONSTRAINT_WITH_CONDITIONS* constraintWithCondition : *pair.second )
delete constraintWithCondition;
delete pair.second;
}
m_constraintMap.clear();
try // attempt to load full set of rules (implicit + user rules)
{
loadImplicitRules();

View File

@ -213,7 +213,6 @@ protected:
KIGFX::WS_PROXY_VIEW_ITEM* m_worksheet;
NETLIST* m_schematicNetlist;
std::vector<DRC_RULE_CONDITION*> m_ruleConditions;
std::vector<DRC_RULE*> m_rules;
bool m_rulesValid;
std::vector<DRC_TEST_PROVIDER*> m_testProviders;

View File

@ -78,6 +78,7 @@ public:
void SetDRCEngine( DRC_ENGINE *engine )
{
m_drcEngine = engine;
m_stats.clear();
}
/**
@ -126,7 +127,7 @@ protected:
DRC_ENGINE* m_drcEngine;
std::unordered_map<const DRC_RULE*, int> m_stats;
bool m_isRuleDriven = true;
bool m_enabled = true;
bool m_enabled = true;
wxString m_msg; // Allocating strings gets expensive enough to want to avoid it
};