Хост VST - Утечка объектов - Juce/C++

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

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

Вот ошибка на вкладке Вывод. Моя программа выдает ошибку 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.

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


person grandcameo    schedule 13.09.2011    source источник


Ответы (2)


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

  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);

That should get rid of most your memory leaks. You will still need to free up the fileInputStream in a manner described in your documentation.

person Kerrek SB    schedule 13.09.2011
comment
Только что посмотрел документацию, возможно, вы даже можете сказать FileInputStream fileInputStream(fileHard); и midFile.readFrom(fileInputStream);, чтобы избавиться от этого уродливого указателя и связанных с ним обязанностей по очистке. - person Kerrek SB; 13.09.2011
comment
Даже лучше! Большое спасибо! - person grandcameo; 13.09.2011
comment
2. Не говорите, что новое в С++??.. Новое в С++, автоматические объекты тоже делают это за кулисами. Я бы так не сказал, вам просто нужно знать, что вы делаете. - person Magnus; 24.09.2013

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

person Vinnie Falco    schedule 13.03.2012