VST 主机 - 泄漏的对象 - Juce/C++
Posted
技术标签:
【中文标题】VST 主机 - 泄漏的对象 - Juce/C++【英文标题】:VST host - Leaked objects - Juce/C++ 【发布时间】:2011-09-13 00:15:11 【问题描述】:我是一名 php 程序员,在构建 VST 主机时学习 C++。我可能咬得比我能咀嚼的多,但我正在取得一些进展(我认为)!
我在 Visual Studio 2010 中使用 Steinberg VST SDK 和 JUCE 库。我遇到了泄漏的对象错误,我不太明白我在搜索错误时找到的解决方案我已收到。
这是“输出”选项卡中的错误。我的程序吐出 JUCE Assetion 错误:
*** Leaked objects detected: 44 instance(s) of class MidiEventHolder
score.exe has triggered a breakpoint
我被带到 juce_amalgamated.h 文件中的这条消息:
~LeakCounter()
if (numObjects.value > 0)
DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << getLeakedObjectClassName());
/** If you hit this, then you've leaked one or more objects of the type specified by
the 'OwnerClass' template parameter - the name should have been printed by the line above.
If you're leaking, it's probably because you're using old-fashioned, non-RAII techniques for
your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays,
ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs!
*/
jassertfalse;
这是我认为错误所指的代码位:
const wchar_t* midiPath = L"C:\\creative\\midi\\m1.mid";
File* fileHard;
FileInputStream* fileInputStream;
fileHard = new File (T("C:\\creative\\midi\\m1.mid"));
fileInputStream = fileHard->createInputStream();
MidiFile * midFile;
midFile = new MidiFile();
midFile->readFrom(*fileInputStream);
midFile->getNumTracks();
midFile->getTrack(0);
也许我正在接近这种语法更像是 PHP?我不太明白什么是 RAII 技术。
感谢任何让我朝着正确方向前进的提示。
【问题讨论】:
【参考方案1】:几件事:
您正在混合使用宽字符串和 Microsoft ("T
") 字符串。选择一个(无论哪个适合您的 API)。
不要在 C++ 中说 new
。它几乎总是不是你需要的。相反,只需使用自动对象:
File fileHard("C:\\creative\\midi\\m1.mid");
FileInputStream * fileInputStream = fileHard.createInputStream();
MidiFile midFile;
midFile.readFrom(*fileInputStream);
midFile.getNumTracks();
midFile.getTrack(0);
这应该可以消除大部分内存泄漏。您仍然需要按照文档中描述的方式释放 fileInputStream
。
【讨论】:
只看文档,也许你甚至可以说FileInputStream fileInputStream(fileHard);
和midFile.readFrom(fileInputStream);
来摆脱那个丑陋的指针和相关的清理责任。
更好!非常感谢!
"2. 不要说 C++ 中的 new"??.. new 是 C++ 的全部内容,自动对象也在幕后进行。我不会这么说,你只需要知道你在做什么。【参考方案2】:
在构建 VST 插件时,一些 Message 对象泄漏是不可避免的,这是 Steinberg 接口的问题,而不是您的问题。如需更多信息,请访问 Juce 论坛,网址为 http://www.rawmaterialsoftware.com/index.php
【讨论】:
以上是关于VST 主机 - 泄漏的对象 - Juce/C++的主要内容,如果未能解决你的问题,请参考以下文章