Autor Wątek: [Audiere][Windows][C++] - memory leak  (Przeczytany 1871 razy)

Offline davidbnpl

  • Użytkownik

# Czerwiec 29, 2012, 16:47:05
Witam. Walczę z tym od 2 edit: 4 dni i już nie mam pojęcia co zrobić :/
Czy da się jakoś zwolnić pamięć po załadowanym przez bibliotekę Audiere pliku? W plikach txt dołączonych jako tutorial do biblioteki wyczytałem:
Cytuj
When you are done using Audiere, just let the RefPtr objects go out of
scope, and they will automatically clean themselves up.  If you really
_must_ delete an object before its pointer goes out of scope, just set
the pointer to 0.
Co by znaczyło, że jeśli obiekt OutputStreamPtr wyjdzie po za zasięg to zostanie wszystko automatycznie posprzątane... Niestety tak nie jest.
void PlaySomething()
{
     OutputStreamPtr st(OpenSound(m_pDevice,"sound.wav"));
     st->play();
}
Przy każdym wywołaniu powyższej funkcji jest alokowana pamięć na plik sound.wav ale nie jest już zwalniana ani po wyjściu po za zasięg zmiennej st ani po zakończeniu odtwarzania dźwięku. Poniższe wersje funkcji też powodują wycieki pamięci:
void PlaySomething2()
{
     OutputStreamPtr st(OpenSound(m_pDevice,"sound.wav"));
     st = NULL;
}

void PlaySomething3(OutputStreamPtr* st)
{
if(st == NULL)
{
st = new OutputStreamPtr(OpenSound(m_pDevice,"sound.wav"));
(*st)->play();
}
else if(!((*st)->isPlaying()))
{
delete st;
st = NULL;
}
}
Jak widać ani automatycznie ani nawet ręcznie nie da się zwolnić pamięci :/ Z tego wynikają problemy:
- muszę każdy dźwięk trzymać w globalnym wskaźniku (np w singletonie upakowane w tablicy), żeby załadować je tylko raz i mieć zawsze do nich dostęp
- to powoduje, że ilość zajętej pamięci rośnie wprost proporcjonalnie do ilości plików, gdyż nie mogę zwolnić pamięci po już nieużywanym dźwięku
- jeśli chcę dany dźwięk odtworzyć równolegle kilkukrotnie muszę utworzyć kilka buforów, które zalegną mi w pamięci i też ich się nie da zwolnić (np 2-sekundowy dźwięk w reakcji na kliknięcie, przy klikaniu 5x/sekundę muszę mieć 10 buforów tego samego dźwięku, których już nie zwolnię)
« Ostatnia zmiana: Czerwiec 30, 2012, 14:16:52 wysłana przez davidbnpl »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych