这是我的代码:
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/