VST host - Утечка объектов - Juce / C ++ - PullRequest
2 голосов
/ 13 сентября 2011

Я программист PHP, изучающий C ++, когда я создаю VST-хост. Возможно, я откусила больше, чем могла жевать, но я делаю некоторые успехи (я думаю)!

Я использую Steinberg VST SDK и библиотеку JUCE в Visual Studio 2010. Я столкнулся с ошибкой утечки объекта, и я не совсем понимаю решения, которые я нашел, когда искал ошибку, которую я получено.

Вот ошибка на вкладке Вывод. Моя программа выплевывает JUCE Ошибка оценки:

*** 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.

Будем благодарны за любые советы, которые помогут мне в правильном направлении.

Ответы [ 2 ]

4 голосов
/ 13 сентября 2011

Несколько вещей:

  1. Вы смешиваете широкие строки и строки Microsoft ("T"). Выберите один (в зависимости от вашего API).

  2. Не говорите new в C ++. Это почти всегда не то, что вам нужно. Вместо этого просто используйте автоматические объекты:

File fileHard("C:\\creative\\midi\\m1.mid");
FileInputStream * fileInputStream = fileHard.createInputStream();

MidiFile midFile;
midFile.readFrom(*fileInputStream);
midFile.getNumTracks();
midFile.getTrack(0);

Это должно избавить вас от большинства утечек памяти. Вам все равно нужно будет освободить fileInputStream способом, описанным в вашей документации.

0 голосов
/ 13 марта 2012

Некоторые утечки объектов сообщения неизбежны при создании плагинов VST, это проблема интерфейса Steinberg, а не ваша.Для получения дополнительной информации посетите форум Juce на http://www.rawmaterialsoftware.com/index.php

...