【发布时间】:2016-08-14 16:13:44
【问题描述】:
这是我的代码:
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 操作符处,它都会分配一块内存。
我应该在 queuedNotes 中的任何 insert 之后使用 free 吗?还是在void函数返回后释放? (即 CreateNoteBlock 的括号)。
或者我可以每次将midiMessage 指针“重用”为新的IMidiMsgExt?
【问题讨论】:
-
向我们展示完整的代码。
queuedNotes是什么? -
@Chiel 这是
multiset<IMidiMsgExt, IMidiMsgExtComp> queuedNotes;。这就是代码:它在类的 CTOR 中被调用。 -
如何使用'IMidiMsgExt midiMessage;'而不是 'IMidiMsgExt* midiMessage = new IMidiMsgExt'?
-
没关系,真的,*midiMessage是传值,也就是做一个拷贝。 queuedNotes 不能取得指针的所有权。所以是的,你必须删除每个新的。
-
您应该永远在使用
new创建的内容上使用free。free与malloc一起使用;对于new,您必须使用delete。永远不要混合它们!混合它们就像从Avis租一辆汽车然后还给赫兹一样,这简直是错误的!在 C++ 中你不应该使用malloc和free,只使用new和delete(撇开智能指针),因为你不只是想分配/回收内存,你还需要构造函数/析构函数运行。请查看stackoverflow.com/questions/240212/…
标签: c++ methods memory-leaks free