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:
parent
7dbb946d29
commit
509f974dfb
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user