diff --git a/src/ScoreKeeperNormal.cpp b/src/ScoreKeeperNormal.cpp index 695c640a28..4514333d2c 100644 --- a/src/ScoreKeeperNormal.cpp +++ b/src/ScoreKeeperNormal.cpp @@ -461,7 +461,7 @@ void ScoreKeeperNormal::HandleComboInternal( int iNumHitContinueCombo, int iNumH { m_pPlayerStageStats->m_iCurMissCombo = 0; } - TimingData td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; + TimingData &td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; if( iNumBreakCombo == 0 ) { int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow( iRow )->GetCombo() ); @@ -481,7 +481,7 @@ void ScoreKeeperNormal::HandleRowComboInternal( TapNoteScore tns, int iNumTapsIn { iNumTapsInRow = min( iNumTapsInRow, 1); } - TimingData td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; + TimingData &td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; if ( tns >= m_MinScoreToContinueCombo ) { m_pPlayerStageStats->m_iCurMissCombo = 0; diff --git a/src/TimingData.cpp b/src/TimingData.cpp index 2583174cdf..84f95877aa 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -11,20 +11,41 @@ TimingData::TimingData(float fOffset) : m_fBeat0OffsetInSeconds(fOffset) { } -TimingData::~TimingData() +void TimingData::Copy( const TimingData& cpy ) +{ + /* de-allocate any old pointers we had */ + Clear(); + + m_fBeat0OffsetInSeconds = cpy.m_fBeat0OffsetInSeconds; + m_sFile = cpy.m_sFile; + + FOREACH_TimingSegmentType( tst ) + { + const vector vpSegs = cpy.m_avpTimingSegments[tst]; + + for( unsigned i = 0; i < vpSegs.size(); ++i ) + AddSegment( vpSegs[i] ); + } +} + +void TimingData::Clear() { -// This is causing weird crashes, probably due to someone hanging onto pointers -// for too long. Commenting this out until we can track it down... -- vyhd -#if 0 /* Delete all pointers owned by this TimingData. */ FOREACH_TimingSegmentType( tst ) { vector &vSegs = m_avpTimingSegments[tst]; for( unsigned i = 0; i < vSegs.size(); ++i ) - delete vSegs[i]; + { + LOG->Trace( "deleting %p", vSegs[i] ); + SAFE_DELETE( vSegs[i] ); } + vSegs.clear(); } -#endif +} + +TimingData::~TimingData() +{ + Clear(); } bool TimingData::empty() const diff --git a/src/TimingData.h b/src/TimingData.h index 67504b3e35..ac6bfefc1b 100644 --- a/src/TimingData.h +++ b/src/TimingData.h @@ -65,16 +65,11 @@ public: TimingData( float fOffset = 0 ); ~TimingData(); - TimingData( const TimingData& rhs ) : m_sFile(rhs.m_sFile), - m_fBeat0OffsetInSeconds(rhs.m_fBeat0OffsetInSeconds) - { - const vector* avpSegs = rhs.m_avpTimingSegments; + void Copy( const TimingData &other ); + void Clear(); - // deep-copy the TimingSegment pointers - FOREACH_TimingSegmentType( tst ) - for( unsigned i = 0; i < avpSegs[tst].size(); ++i ) - m_avpTimingSegments[tst].push_back( avpSegs[tst][i]->Copy() ); - } + TimingData( const TimingData &cpy ) { Copy(cpy); } + TimingData& operator=( const TimingData &cpy ) { Copy(cpy); return *this; } int GetSegmentIndexAtRow(TimingSegmentType tst, int row) const; int GetSegmentIndexAtBeat(TimingSegmentType tst, float beat) const