mar*_*zzz 0 c++ methods free memory-leaks
这是我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
所以每个new操作员都会分配一块内存.
我应该在queuedNotes里面free之后使用insert吗?或者它将在void函数返回后发布?(即CreateNoteBlock的括号).
或者我可以"重复"每次midiMessage指针为新IMidiMsgExt?
答案是根本不使用new.创建具有自动存储持续时间的对象
IMidiMsgExt midiMessage;
Run Code Online (Sandbox Code Playgroud)
然后你可以继续调用MakemidiMessageMsg并将消息的副本插入到multiset.
midiMessage.MakemidiMessageMsg(57, 100, 0, 0, 0);
queuedNotes.insert(midiMessage);
midiMessage.MakemidiMessageMsg(60, 100, 0, tickSize * 38, 0);
queuedNotes.insert(midiMessage);
//...
Run Code Online (Sandbox Code Playgroud)
现在它multiset拥有所有消息的副本,并且在函数结束时midiMessage被销毁,并且不需要进行内存管理.
如果IMidiMsgExt有一个构造函数,就像MakemidiMessageMsg你可以构建一个完整的消息,那么你可以进一步降低它并使用类似的东西
queuedNotes.insert(IMidiMsgExt(57, 100, 0, 0, 0));
queuedNotes.insert(IMidiMsgExt(60, 100, 0, tickSize * 38, 0));
Run Code Online (Sandbox Code Playgroud)
现在我们甚至不需要midiMessage.
你来自Java或C#背景吗?在C++中,您不必使用new创建对象,只需声明它们就可以正常工作:
IMidiMsgExt midiMessage;
midiMessage.MakemidiMessageMsg(57, 100, 0, 0, 0);
queuedNotes.insert(midiMessage);
Run Code Online (Sandbox Code Playgroud)
这是(这是我推荐的解决方案),或者您必须明确释放对象:
IMidiMsgExt* midiMessage = new IMidiMsgExt;
midiMessage->MakemidiMessageMsg(57, 100, 0, 0, 0);
queuedNotes.insert(*midiMessage);
delete miniMessage;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |