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:
parent
aa3f7f2414
commit
9e6435ff14
@ -93,7 +93,12 @@ UndoTransaction::add_command (Command* const cmd)
|
|||||||
void
|
void
|
||||||
UndoTransaction::remove_command (Command* const action)
|
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
|
bool
|
||||||
|
Loading…
Reference in New Issue
Block a user