13
0

Fix mem-leak, Playlist/Region SessionHandleRef

When a playlist is deleted and drops_references(), any
undo/redo StatefulDiffCommand referncing playlist invoke
Destructible::drop_references() of the Command.

This leads to command_death(). As opposed to UndoTransaction::clear()
the StatefulDiffCommand was not destroyed.

In case of playlists StatefulDiffCommand::_changes contains
PBD::SequenceProperty<std::list<boost::shared_ptr<Region> > >
and shared pointer reference of the playlist regions were kept
indefinitely.

This fixes the following scenario:
New session, import an file, delete the created track,
clean up unused sources (delete unused playlists)[, quit].

A reference to the imported region was kept, because of the
playlist's undo command (insert region). Yet the source file
was deleted.


PS. Most playlist changes are accompanied by GUI zoom/selection
MementoCommands. Those are currently never directly dropped.
command_death() leaves those in place.
This commit is contained in:
Robin Gareus 2020-02-25 21:25:10 +01:00
parent aa3f7f2414
commit 9e6435ff14
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -93,7 +93,12 @@ UndoTransaction::add_command (Command* const cmd)
void
UndoTransaction::remove_command (Command* const action)
{
actions.remove (action);
list<Command*>::iterator i =std::find (actions.begin (), actions.end (), action);
if (i == actions.end ()) {
return;
}
actions.erase (i);
delete action;
}
bool