fix memory leak in TimingData, remove unnecessary structure copies in ScoreKeeperNormal

This commit is contained in:
Mark Cannon
2011-09-18 19:07:39 +00:00
parent 9243c78fce
commit f0880d6fd2
3 changed files with 33 additions and 17 deletions
+2 -2
View File
@@ -461,7 +461,7 @@ void ScoreKeeperNormal::HandleComboInternal( int iNumHitContinueCombo, int iNumH
{ {
m_pPlayerStageStats->m_iCurMissCombo = 0; 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 ) if( iNumBreakCombo == 0 )
{ {
int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow( iRow )->GetCombo() ); int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow( iRow )->GetCombo() );
@@ -481,7 +481,7 @@ void ScoreKeeperNormal::HandleRowComboInternal( TapNoteScore tns, int iNumTapsIn
{ {
iNumTapsInRow = min( iNumTapsInRow, 1); 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 ) if ( tns >= m_MinScoreToContinueCombo )
{ {
m_pPlayerStageStats->m_iCurMissCombo = 0; m_pPlayerStageStats->m_iCurMissCombo = 0;
+27 -6
View File
@@ -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<TimingSegment*> 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. */ /* Delete all pointers owned by this TimingData. */
FOREACH_TimingSegmentType( tst ) FOREACH_TimingSegmentType( tst )
{ {
vector<TimingSegment*> &vSegs = m_avpTimingSegments[tst]; vector<TimingSegment*> &vSegs = m_avpTimingSegments[tst];
for( unsigned i = 0; i < vSegs.size(); ++i ) for( unsigned i = 0; i < vSegs.size(); ++i )
delete vSegs[i]; {
LOG->Trace( "deleting %p", vSegs[i] );
SAFE_DELETE( vSegs[i] ); }
vSegs.clear(); vSegs.clear();
} }
#endif }
TimingData::~TimingData()
{
Clear();
} }
bool TimingData::empty() const bool TimingData::empty() const
+4 -9
View File
@@ -65,16 +65,11 @@ public:
TimingData( float fOffset = 0 ); TimingData( float fOffset = 0 );
~TimingData(); ~TimingData();
TimingData( const TimingData& rhs ) : m_sFile(rhs.m_sFile), void Copy( const TimingData &other );
m_fBeat0OffsetInSeconds(rhs.m_fBeat0OffsetInSeconds) void Clear();
{
const vector<TimingSegment*>* avpSegs = rhs.m_avpTimingSegments;
// deep-copy the TimingSegment pointers TimingData( const TimingData &cpy ) { Copy(cpy); }
FOREACH_TimingSegmentType( tst ) TimingData& operator=( const TimingData &cpy ) { Copy(cpy); return *this; }
for( unsigned i = 0; i < avpSegs[tst].size(); ++i )
m_avpTimingSegments[tst].push_back( avpSegs[tst][i]->Copy() );
}
int GetSegmentIndexAtRow(TimingSegmentType tst, int row) const; int GetSegmentIndexAtRow(TimingSegmentType tst, int row) const;
int GetSegmentIndexAtBeat(TimingSegmentType tst, float beat) const int GetSegmentIndexAtBeat(TimingSegmentType tst, float beat) const