这是我的代码:

void MIDITest::CreateNoteBlock() {
    IMidiMsgExt* midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(57, 100, 0, 0, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(60, 100, 0, tickSize * 38, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(62, 100, 0, 0, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(65, 100, 0, tickSize * 32, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(57, 0, tickSize * 111, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(60, 0, tickSize * 111, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(62, 0, tickSize * 75, 0);
    queuedNotes.insert(*midiMessage);

    midiMessage = new IMidiMsgExt;
    midiMessage->MakemidiMessageMsg(65, 0, tickSize * 105, 0);
    queuedNotes.insert(*midiMessage);
}


因此在每个new运算符处,它将分配一块内存。

我应该在排队的注释中的任何free之后使用insert吗?还是在void函数返回后将其释放? (即CreateNoteBlock的括号)。

还是每次midiMessage指针都可以“重用”新的IMidiMsgExt

最佳答案

答案是根本不使用new。创建具有自动存储期限的对象

IMidiMsgExt midiMessage;


然后,您可以继续调用MakemidiMessageMsg并将消息的副本插入multiset

midiMessage.MakemidiMessageMsg(57, 100, 0, 0, 0);
queuedNotes.insert(midiMessage);
midiMessage.MakemidiMessageMsg(60, 100, 0, tickSize * 38, 0);
queuedNotes.insert(midiMessage);
//...


现在,multiset具有所有消息的副本,并且在功能midiMessage的末尾已销毁,并且不需要执行任何内存管理。

如果IMidiMsgExt具有类似MakemidiMessageMsg的构造函数,您可以在其中构造完整的消息,则可以将其进一步简化并使用类似

queuedNotes.insert(IMidiMsgExt(57, 100, 0, 0, 0));
queuedNotes.insert(IMidiMsgExt(60, 100, 0, tickSize * 38, 0));


现在我们甚至不需要midiMessage

关于c++ - 如何避免这种内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36769964/

10-11 16:31