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++的主要内容,如果未能解决你的问题,请参考以下文章

VST 音频插件如何检测来自 VST 主机的流中断?

如何在代码中实例化 Vst3 插件?对于 vst3 主机应用程序

从 JUCE 音频 VST 插件控制主机播放

VST 主机 - MIDI 到波形转换 (C#)

主机不会加载 VST 插件效果

使用 VST 插件失真的音频