From 651067ef789198efe2cd2b7a1404cf35e357ed16 Mon Sep 17 00:00:00 2001 From: Emmanuel Benoit Date: Sun, 1 Apr 2018 20:54:10 +0200 Subject: [PATCH] Sequencer - Fixed yet another dangling pointer Curves referenced through a pointer were being deleted in batch, causing some of the later curves to point to random shit. --- c-syncedit.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/c-syncedit.cc b/c-syncedit.cc index 2e3ed23..8e80e96 100644 --- a/c-syncedit.cc +++ b/c-syncedit.cc @@ -328,10 +328,11 @@ void SyncEditor::DeleteSegment( auto& undo{ dynamic_cast< T_UndoSyncChanges& >( Common::Undo( ).add< T_UndoSyncChanges >( ) ) }; + T_AutoArray< T_String , 8 > dcNames; // Curves to delete for ( auto i = 0u ; i < nc ; i ++ ) { if ( curves[ i ]->segments.size( ) == 1 ) { undo.curveDeletion( *curves[ i ] ); - sync.removeCurve( curves[ i ]->name ); + dcNames.add( curves[ i ]->name ); } else { auto nCurve{ *curves[ i ] }; nCurve.segments.remove( segmentIndex ); @@ -339,6 +340,13 @@ void SyncEditor::DeleteSegment( sync.setCurve( std::move( nCurve ) ); } } + + // We delete curves that need to be deleted now, in order to avoid + // using dangling curve pointers in the loop above + const auto nd{ dcNames.size( ) }; + for ( auto i = 0u ; i < nd ; i ++ ) { + sync.removeCurve( dcNames[ i ] ); + } } /*----------------------------------------------------------------------------*/