1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-19 14:17:41 +02:00

Consistently use delete[] not free for NoteTrack serialization...

... Because allocation is with new[], if you search for where it happens in
lib-src.
This commit is contained in:
Paul Licameli 2017-03-03 13:26:35 -05:00
parent 7dbb946d29
commit 509f974dfb
3 changed files with 8 additions and 12 deletions

View File

@ -110,7 +110,6 @@ Track(projDirManager)
SetName(GetDefaultName()); SetName(GetDefaultName());
mSeq = NULL; mSeq = NULL;
mSerializationBuffer = NULL;
mSerializationLength = 0; mSerializationLength = 0;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
@ -125,9 +124,6 @@ Track(projDirManager)
NoteTrack::~NoteTrack() NoteTrack::~NoteTrack()
{ {
if (mSerializationBuffer) {
delete [] mSerializationBuffer;
}
} }
Track::Holder NoteTrack::Duplicate() const Track::Holder NoteTrack::Duplicate() const
@ -143,13 +139,15 @@ Track::Holder NoteTrack::Duplicate() const
SonifyBeginSerialize(); SonifyBeginSerialize();
assert(!mSerializationBuffer); assert(!mSerializationBuffer);
// serialize from this to duplicate's mSerializationBuffer // serialize from this to duplicate's mSerializationBuffer
mSeq->serialize((void**)&duplicate->mSerializationBuffer, void *buffer;
mSeq->serialize(&buffer,
&duplicate->mSerializationLength); &duplicate->mSerializationLength);
duplicate->mSerializationBuffer.reset( (char*)buffer );
SonifyEndSerialize(); SonifyEndSerialize();
} else if (mSerializationBuffer) { } else if (mSerializationBuffer) {
SonifyBeginUnserialize(); SonifyBeginUnserialize();
assert(!mSeq); assert(!mSeq);
std::unique_ptr<Alg_track> alg_track{ Alg_seq::unserialize(mSerializationBuffer, std::unique_ptr<Alg_track> alg_track{ Alg_seq::unserialize(mSerializationBuffer.get(),
mSerializationLength) }; mSerializationLength) };
assert(alg_track->get_type() == 's'); assert(alg_track->get_type() == 's');
duplicate->mSeq.reset(static_cast<Alg_seq*>(alg_track.release())); duplicate->mSeq.reset(static_cast<Alg_seq*>(alg_track.release()));
@ -198,9 +196,8 @@ void NoteTrack::WarpAndTransposeNotes(double t0, double t1,
const auto nt = static_cast<NoteTrack*>(unt.get()); const auto nt = static_cast<NoteTrack*>(unt.get());
wxASSERT(!mSeq && nt->mSeq && !nt->mSerializationBuffer); wxASSERT(!mSeq && nt->mSeq && !nt->mSerializationBuffer);
// swap mSeq and Buffer between this and nt // swap mSeq and Buffer between this and nt
nt->mSerializationBuffer = mSerializationBuffer; nt->mSerializationBuffer = std::move(mSerializationBuffer);
nt->mSerializationLength = mSerializationLength; nt->mSerializationLength = mSerializationLength;
mSerializationBuffer = NULL;
mSerializationLength = 0; mSerializationLength = 0;
mSeq = std::move(nt->mSeq); mSeq = std::move(nt->mSeq);
} }

View File

@ -198,7 +198,7 @@ class AUDACITY_DLL_API NoteTrack final : public Track {
// mSeq variable. (TrackArtist should check to make sure this // mSeq variable. (TrackArtist should check to make sure this
// flip-flop from mSeq to mSerializationBuffer happened an // flip-flop from mSeq to mSerializationBuffer happened an
// even number of times, otherwise mSeq will be NULL). // even number of times, otherwise mSeq will be NULL).
mutable char *mSerializationBuffer; // NULL means no buffer mutable std::unique_ptr<char[]> mSerializationBuffer; // NULL means no buffer
long mSerializationLength; long mSerializationLength;
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT

View File

@ -2829,12 +2829,11 @@ void TrackArtist::DrawNoteTrack(const NoteTrack *track,
// JKC: Previously this indirected via seq->, a NULL pointer. // JKC: Previously this indirected via seq->, a NULL pointer.
// This was actually OK, since unserialize is a static function. // This was actually OK, since unserialize is a static function.
// Alg_seq:: is clearer. // Alg_seq:: is clearer.
std::unique_ptr<Alg_track> alg_track{ Alg_seq::unserialize(track->mSerializationBuffer, std::unique_ptr<Alg_track> alg_track{ Alg_seq::unserialize(track->mSerializationBuffer.get(),
track->mSerializationLength) }; track->mSerializationLength) };
assert(alg_track->get_type() == 's'); assert(alg_track->get_type() == 's');
const_cast<NoteTrack*>(track)->mSeq.reset(seq = static_cast<Alg_seq*>(alg_track.release())); const_cast<NoteTrack*>(track)->mSeq.reset(seq = static_cast<Alg_seq*>(alg_track.release()));
free(track->mSerializationBuffer); track->mSerializationBuffer.reset();
track->mSerializationBuffer = NULL;
} }
assert(seq); assert(seq);
int visibleChannels = track->mVisibleChannels; int visibleChannels = track->mVisibleChannels;