diff --git a/libmscore/chordrest.cpp b/libmscore/chordrest.cpp index 1e4ef8c3f..8ed464fca 100644 --- a/libmscore/chordrest.cpp +++ b/libmscore/chordrest.cpp @@ -108,6 +108,7 @@ ChordRest::~ChordRest() { qDeleteAll(_lyrics); qDeleteAll(_el); + delete _beam; delete _tabDur; } @@ -752,8 +753,12 @@ void ChordRest::removeDeleteBeam(bool beamed) if (_beam) { Beam* b = _beam; _beam->remove(this); - if (b->empty()) - score()->undoRemoveElement(b); + if (b->empty()) { + //score()->undoRemoveElement(b); + if (b->selected()) + score()->deselect(b); + delete b; + } } if (!beamed && isChord()) toChord(this)->layoutStem(); diff --git a/libmscore/excerpt.cpp b/libmscore/excerpt.cpp index 1e0a5ac8a..6b6729b65 100644 --- a/libmscore/excerpt.cpp +++ b/libmscore/excerpt.cpp @@ -157,6 +157,8 @@ void Excerpt::createExcerpt(Excerpt* excerpt) // Set instruments and create linked staffs for (const Part* part : parts) { Part* p = new Part(score); + if (part->instrument(-1)) + delete p->instrument(-1); // delete default instrument (it is going to be overwritten) p->setInstrument(*part->instrument()); p->setPartName(part->partName()); diff --git a/libmscore/instrument.cpp b/libmscore/instrument.cpp index b765373fc..e1e6fa6c0 100644 --- a/libmscore/instrument.cpp +++ b/libmscore/instrument.cpp @@ -265,7 +265,7 @@ void Instrument::read(XmlReader& e, Part* part) { bool customDrumset = false; - _channel.clear(); // remove default channel + clearChannels(); // remove default channel while (e.readNextStartElement()) { if (!readProperties(e, part, &customDrumset)) e.unknown(); @@ -987,7 +987,7 @@ Instrument Instrument::fromTemplate(const InstrumentTemplate* t) instr.setClefType(i, t->clefTypes[i]); instr.setMidiActions(t->midiActions); instr.setArticulation(t->articulation); - instr._channel.clear(); + instr.clearChannels(); for (const Channel& c : t->channel) instr._channel.append(new Channel(c)); instr.setStringData(t->stringData); diff --git a/libmscore/instrument.h b/libmscore/instrument.h index a67fd2d16..f6f69a0de 100644 --- a/libmscore/instrument.h +++ b/libmscore/instrument.h @@ -190,7 +190,7 @@ class Instrument { const QList& channel() const { return _channel; } void appendChannel(Channel* c) { _channel.append(c); } - void clearChannels() { _channel.clear(); } + void clearChannels() { qDeleteAll(_channel.begin(),_channel.end()); _channel.clear(); } void setMidiActions(const QList& l) { _midiActions = l; } void setArticulation(const QList& l) { _articulation = l; } diff --git a/libmscore/layout.cpp b/libmscore/layout.cpp index b4d01d154..fa730d695 100644 --- a/libmscore/layout.cpp +++ b/libmscore/layout.cpp @@ -2242,6 +2242,7 @@ void Score::createBeams(Measure* measure) else { beam = a1->beam(); if (beam == 0 || beam->elements().front() != a1) { + delete beam; // delete old beam beam = new Beam(this); beam->setGenerated(true); beam->setTrack(track); @@ -3810,7 +3811,7 @@ void Score::doLayoutRange(int stick, int etick) if (mb->isMeasure() && toMeasure(mb)->mmRest()) toMeasure(mb)->mmRest()->setSystem(0); } -// qDeleteAll(_systems); + qDeleteAll(_systems); _systems.clear(); qDeleteAll(pages()); diff --git a/libmscore/mcursor.cpp b/libmscore/mcursor.cpp index 23421944d..14595b9e0 100644 --- a/libmscore/mcursor.cpp +++ b/libmscore/mcursor.cpp @@ -163,6 +163,7 @@ void MCursor::addPart(const QString& instrument) if (it == 0) { qFatal("Did not find instrument <%s>", qPrintable(instrument)); } + delete part->instrument(-1); // delete default instrument part->initFromInstrTemplate(it); _score->appendPart(part); _score->insertStaff(staff, 0); diff --git a/libmscore/part.cpp b/libmscore/part.cpp index 7d7e0cc9e..cf0e03637 100644 --- a/libmscore/part.cpp +++ b/libmscore/part.cpp @@ -74,6 +74,7 @@ bool Part::readProperties(XmlReader& e) else if (tag == "Instrument") { Instrument* instr = new Instrument; instr->read(e, this); + delete instrument(-1); // delete default instrument setInstrument(instr, -1); } else if (tag == "name") @@ -673,5 +674,15 @@ bool Part::hasDrumStaff() } return false; } + +//--------------------------------------------------------- +// ~Part +//--------------------------------------------------------- + +Part::~Part() + { + for (auto it = _instruments.begin(); it != _instruments.end(); ++it) + delete it->second; + } } diff --git a/libmscore/part.h b/libmscore/part.h index 712a1c3db..c5a205fc2 100644 --- a/libmscore/part.h +++ b/libmscore/part.h @@ -53,6 +53,7 @@ class Part final : public ScoreElement { public: Part(Score* = 0); + ~Part(); void initFromInstrTemplate(const InstrumentTemplate*); virtual ElementType type() const override { return ElementType::PART; } diff --git a/libmscore/read114.cpp b/libmscore/read114.cpp index 5b023fb86..3e17dfac9 100644 --- a/libmscore/read114.cpp +++ b/libmscore/read114.cpp @@ -1860,6 +1860,7 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e) if (ks->links()->size() == 1) e.linkIds().remove(ks->links()->lid()); } + delete ks; } else { // if key sig not at beginning of measure => courtesy key sig diff --git a/libmscore/read206.cpp b/libmscore/read206.cpp index 02d0a9902..90bd8e251 100644 --- a/libmscore/read206.cpp +++ b/libmscore/read206.cpp @@ -2782,6 +2782,7 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e) if (ks->links()->size() == 1) e.linkIds().remove(ks->links()->lid()); } + delete ks; } else { // if key sig not at beginning of measure => courtesy key sig @@ -2801,9 +2802,9 @@ static void readMeasure(Measure* m, int staffIdx, XmlReader& e) if (t->links()->size() == 1) { qDebug("reading empty text: deleted lid = %d", t->links()->lid()); e.linkIds().remove(t->links()->lid()); - delete t; } } + delete t; } else { if (!t->autoplace()) { diff --git a/libmscore/score.cpp b/libmscore/score.cpp index 39cc8e575..ecd45e813 100644 --- a/libmscore/score.cpp +++ b/libmscore/score.cpp @@ -4330,6 +4330,17 @@ MasterScore::MasterScore(const MStyle& s) MasterScore::~MasterScore() { + _movements->erase(std::remove(_movements->begin(),_movements->end(),this),_movements->end()); + MasterScore* ps = 0; + for (MasterScore* s : *_movements) { + s->setPrev(ps); + if (ps) + ps->setNext(s); + s->setNext(0); + ps = s; + } + if (_movements->empty()) + delete _movements; delete _revisions; delete _repeatList; delete _sigmap; diff --git a/libmscore/spanner.cpp b/libmscore/spanner.cpp index de91621bb..f5f4d98e6 100644 --- a/libmscore/spanner.cpp +++ b/libmscore/spanner.cpp @@ -298,7 +298,11 @@ Spanner::Spanner(const Spanner& s) Spanner::~Spanner() { + for (SpannerSegment* ss : spannerSegments()) + if (ss->system()) + ss->system()->remove(ss); qDeleteAll(spannerSegments()); + spannerSegments().clear(); } //--------------------------------------------------------- diff --git a/mscore/file.cpp b/mscore/file.cpp index 10666f358..c762ae1f4 100644 --- a/mscore/file.cpp +++ b/mscore/file.cpp @@ -525,7 +525,7 @@ MasterScore* MuseScore::getNewFile() // create instruments from template for (Part* tpart : tscore->parts()) { Part* part = new Part(score); - part->setInstrument(tpart->instrument()); + part->setInstrument(*tpart->instrument()); part->setPartName(tpart->partName()); for (Staff* tstaff : *tpart->staves()) { diff --git a/mscore/icons.cpp b/mscore/icons.cpp index b8337ecc8..00d6afaae 100644 --- a/mscore/icons.cpp +++ b/mscore/icons.cpp @@ -167,6 +167,8 @@ static const char* iconNames[] = { void genIcons() { + for (int i = 0; i < (int(Icons::voice1_ICON) + VOICES); ++i) // delete stored icons + delete icons[i]; for (int i = 0; i < int(Icons::voice1_ICON); ++i) { QIcon* icon = new QIcon(new MIconEngine); icon->addFile(iconPath + iconNames[i]); diff --git a/mscore/importgtp-gp6.cpp b/mscore/importgtp-gp6.cpp index c3522b976..9a63b29e0 100644 --- a/mscore/importgtp-gp6.cpp +++ b/mscore/importgtp-gp6.cpp @@ -508,6 +508,7 @@ void GuitarPro6::readTracks(QDomNode* track) QString ref = currentNode.attributes().namedItem("ref").toAttr().value(); auto it = instrumentMapping.find(ref); if (it != instrumentMapping.end()) { + delete part->instrument(-1); // delete default instrument part->setInstrument(Instrument::fromTemplate(Ms::searchTemplate(it->second))); } else diff --git a/mscore/importgtp.cpp b/mscore/importgtp.cpp index 69674040a..9212f39eb 100644 --- a/mscore/importgtp.cpp +++ b/mscore/importgtp.cpp @@ -2717,8 +2717,10 @@ Score::FileError importGTP(MasterScore* score, const QString& name) if (name.endsWith(".gpx", Qt::CaseInsensitive) || strcmp(header, "BCFZ") == 0) { gp = new GuitarPro6(score); gp->initGuitarProDrumset(); - readResult = gp->read(&fp); - gp->setTempo(0, 0); + readResult = gp->read(&fp); + gp->setTempo(0, 0); + delete gpDrumset; + gpDrumset = nullptr; } // otherwise it's an older version - check the header else if (strcmp(&header[1], "FIC") == 0) { @@ -2756,6 +2758,8 @@ Score::FileError importGTP(MasterScore* score, const QString& name) gp->initGuitarProDrumset(); readResult = gp->read(&fp); gp->setTempo(0, 0); + delete gpDrumset; + gpDrumset = nullptr; } else { return Score::FileError::FILE_BAD_FORMAT; @@ -2846,6 +2850,7 @@ Score::FileError importGTP(MasterScore* score, const QString& name) QList stavesMap; Part* p = new Part(pscore); + delete p->instrument(-1); // delete default instrument p->setInstrument(*part->instrument()); //TODO-ws pscore->tuning = gp->tunings[counter++]; diff --git a/mscore/importmidi/importmidi_instrument.cpp b/mscore/importmidi/importmidi_instrument.cpp index 90406b59d..28d5ee5db 100644 --- a/mscore/importmidi/importmidi_instrument.cpp +++ b/mscore/importmidi/importmidi_instrument.cpp @@ -384,8 +384,10 @@ void createInstruments(Score *score, QList &tracks) const int instrIndex = opers.data()->trackOpers.msInstrIndex.value( track.indexOfOperation); instr = instrList[instrIndex]; - if (instr) + if (instr) { + delete part->instrument(-1); // delete default instrument part->initFromInstrTemplate(instr); + } } if (areNext3OrganStaff(idx, tracks)) diff --git a/mscore/importmxmlpass1.cpp b/mscore/importmxmlpass1.cpp index 330fd13cf..e9353aa42 100644 --- a/mscore/importmxmlpass1.cpp +++ b/mscore/importmxmlpass1.cpp @@ -925,6 +925,8 @@ void MusicXMLParserPass1::scorePartwise() if (pg->barlineSpan) staff->setBarLineSpan(pg->span); } + qDeleteAll(partGroupList); + partGroupList.clear(); // handle the implicit brackets: // multi-staff parts w/o explicit brackets get a brace diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index fe040e04a..779d7915e 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -1829,6 +1829,7 @@ MuseScore::MuseScore() MuseScore::~MuseScore() { + clearInstrumentTemplates(); delete synti; } diff --git a/mtest/testutils.cpp b/mtest/testutils.cpp index 5746f966e..7c2972ddd 100644 --- a/mtest/testutils.cpp +++ b/mtest/testutils.cpp @@ -341,5 +341,14 @@ void MTest::initMTest() loadInstrumentTemplates(":/instruments.xml"); score = readScore("test.mscx"); } + +//--------------------------------------------------------- +// initMTest +//--------------------------------------------------------- + +MTest::~MTest() + { + clearInstrumentTemplates(); + } } diff --git a/mtest/testutils.h b/mtest/testutils.h index c782744d7..917f69c13 100644 --- a/mtest/testutils.h +++ b/mtest/testutils.h @@ -34,6 +34,7 @@ class MTest { EditData ed; MTest(); + ~MTest(); Ms::MasterScore* readScore(const QString& name); Ms::MasterScore* readCreatedScore(const QString& name); bool saveScore(Ms::Score*, const QString& name) const;