diff options
author | Robin Gareus <robin@gareus.org> | 2020-02-25 21:25:10 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2020-02-25 21:45:07 +0100 |
commit | 9e6435ff145ed7c99312e0d51d9dd23a1a8c3997 (patch) | |
tree | 1266a41d217b3afa2273161470069e9a62306b14 /libs/pbd | |
parent | aa3f7f24147fe0857ed4f0b08a3da4e08a0f7e3e (diff) |
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.
Diffstat (limited to 'libs/pbd')
-rw-r--r-- | libs/pbd/undo.cc | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/libs/pbd/undo.cc b/libs/pbd/undo.cc index 0c1528aedb..da35bc50ec 100644 --- a/libs/pbd/undo.cc +++ b/libs/pbd/undo.cc @@ -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 |