Любой malloc
обычно free
в другом месте тем же модулем. Я говорю в целом, потому что вы, возможно, никогда не захотите вернуть память из соображений производительности или сохранения. Кроме того, выделение памяти будет восстановлено операционной системой, когда процесс завершится, независимо от того, что вы не подвергаете систему опасности.
Поскольку вы malloc
добавили баф, вы должны free
его сделать сами. Сохраните SDL_FreeWav
волновые буферы, переданные вам SDL, с которыми вы закончили (например, из SDL_LoadWav
).
Внутренний для SDL_LoadWav
будет malloc
вызовом SDL. SDL_FreeWav
— это оболочка вокруг соответствующего free
. Такое сочетание функций выделения/освобождения является распространенным явлением, поскольку некоторые библиотеки могут реализовывать собственные процедуры управления памятью, которые напоминают или обертывают malloc
и free
. Они могут даже открывать новые контексты кучи, недоступные из стандартных функций и предназначенные для приватности. Нет даже требования, чтобы память была выделена в куче, но это ортогонально вашему вопросу.
Вполне вероятно, что SDL_FreeWav
— это просто free
, но когда библиотека предоставляет функции освобождения памяти, вы должны предпочесть их, если поведение отличается.
Если вы сомневаетесь, всегда вызывайте процедуру освобождения, если считаете, что закончили с ресурсом памяти. Двойные ошибки free
шумны и обычно генерируют трассировку стека, которая позволит вам быстро определить проблему. Другие библиотеки, такие как glib, обычно имеют встроенную диагностику, которая предупредит вас о чрезмерном освобождении памяти. Агрессивное освобождение также помогает обнаружить логические ошибки: если вы считаете, что закончили с памятью, а какая-то другая часть программы — нет, использование ресурсов необходимо пересмотреть.
person
Matt Joiner
schedule
26.06.2011
SDL_FreeWAV()
, однако было бы удивительно (и довольно асимметрично), чтоSDL
требует от вас выделения вручную, но сам позаботится об удалении (как он может знать, как вы выделили свою память?) - person ereOn   schedule 24.06.2011SDL_LoadWAV
и освобождается с помощьюSDL_FreeWAV
, но я спрашиваю не об этом. Все говорит о том, что вы (и @Armen) правы. - person BЈовић   schedule 24.06.2011s/must/almost always/
:П - person Matt Joiner   schedule 26.06.2011