Database library cache: fix memory leak
Fixes https://gitlab.com/kicad/code/kicad/-/issues/17435
(cherry picked from commit 4851b0f1ac
)
This commit is contained in:
parent
71af5b106a
commit
c935ef890a
|
@ -79,7 +79,7 @@ void SCH_IO_DATABASE::EnumerateSymbolLib( std::vector<LIB_SYMBOL*>& aSymbolList,
|
|||
|
||||
for( auto const& pair : m_nameToSymbolcache )
|
||||
{
|
||||
LIB_SYMBOL* symbol = pair.second;
|
||||
LIB_SYMBOL* symbol = pair.second.get();
|
||||
|
||||
if( !powerSymbolsOnly || symbol->IsPower() )
|
||||
aSymbolList.emplace_back( symbol );
|
||||
|
@ -151,7 +151,7 @@ LIB_SYMBOL* SCH_IO_DATABASE::LoadSymbol( const wxString& aLibraryPath,
|
|||
|
||||
wxCHECK( foundTable, nullptr );
|
||||
|
||||
return loadSymbolFromRow( aAliasName, *foundTable, result );
|
||||
return loadSymbolFromRow( aAliasName, *foundTable, result ).release();
|
||||
}
|
||||
|
||||
|
||||
|
@ -236,10 +236,10 @@ void SCH_IO_DATABASE::cacheLib()
|
|||
wxString name( fmt::format( "{}{}", prefix,
|
||||
std::any_cast<std::string>( result[table.key_col] ) ) );
|
||||
|
||||
LIB_SYMBOL* symbol = loadSymbolFromRow( name, table, result );
|
||||
std::unique_ptr<LIB_SYMBOL> symbol = loadSymbolFromRow( name, table, result );
|
||||
|
||||
if( symbol )
|
||||
m_nameToSymbolcache.insert( { symbol->GetName(), symbol } );
|
||||
m_nameToSymbolcache[symbol->GetName()] = std::move( symbol );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -414,11 +414,11 @@ std::optional<bool> SCH_IO_DATABASE::boolFromAny( const std::any& aVal )
|
|||
}
|
||||
|
||||
|
||||
LIB_SYMBOL* SCH_IO_DATABASE::loadSymbolFromRow( const wxString& aSymbolName,
|
||||
std::unique_ptr<LIB_SYMBOL> SCH_IO_DATABASE::loadSymbolFromRow( const wxString& aSymbolName,
|
||||
const DATABASE_LIB_TABLE& aTable,
|
||||
const DATABASE_CONNECTION::ROW& aRow )
|
||||
{
|
||||
LIB_SYMBOL* symbol = nullptr;
|
||||
std::unique_ptr<LIB_SYMBOL> symbol = nullptr;
|
||||
|
||||
if( aRow.count( aTable.symbols_col ) )
|
||||
{
|
||||
|
@ -436,7 +436,7 @@ LIB_SYMBOL* SCH_IO_DATABASE::loadSymbolFromRow( const wxString& aSymbolName,
|
|||
{
|
||||
wxLogTrace( traceDatabase, wxT( "loadSymbolFromRow: found original symbol '%s'" ),
|
||||
symbolIdStr );
|
||||
symbol = originalSymbol->Duplicate();
|
||||
symbol.reset( originalSymbol->Duplicate() );
|
||||
symbol->SetSourceLibId( symbolId );
|
||||
}
|
||||
else if( !symbolId.IsValid() )
|
||||
|
@ -455,7 +455,7 @@ LIB_SYMBOL* SCH_IO_DATABASE::loadSymbolFromRow( const wxString& aSymbolName,
|
|||
{
|
||||
// Actual symbol not found: return metadata only; error will be indicated in the
|
||||
// symbol chooser
|
||||
symbol = new LIB_SYMBOL( aSymbolName );
|
||||
symbol.reset( new LIB_SYMBOL( aSymbolName ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -93,9 +93,9 @@ private:
|
|||
|
||||
void connect();
|
||||
|
||||
LIB_SYMBOL* loadSymbolFromRow( const wxString& aSymbolName,
|
||||
const DATABASE_LIB_TABLE& aTable,
|
||||
const DATABASE_CONNECTION::ROW& aRow );
|
||||
std::unique_ptr<LIB_SYMBOL> loadSymbolFromRow( const wxString& aSymbolName,
|
||||
const DATABASE_LIB_TABLE& aTable,
|
||||
const DATABASE_CONNECTION::ROW& aRow );
|
||||
|
||||
static std::optional<bool> boolFromAny( const std::any& aVal );
|
||||
|
||||
|
@ -110,7 +110,7 @@ private:
|
|||
|
||||
std::set<wxString> m_defaultShownFields;
|
||||
|
||||
std::map<wxString, LIB_SYMBOL*> m_nameToSymbolcache;
|
||||
std::map<wxString, std::unique_ptr<LIB_SYMBOL>> m_nameToSymbolcache;
|
||||
|
||||
long long m_cacheTimestamp;
|
||||
|
||||
|
|
Loading…
Reference in New Issue