Любой malloc
обычно равен free
в другом месте того же модуля. Я говорю вообще, потому что вы, возможно, никогда не намереваетесь вернуть память по соображениям производительности или постоянства. Кроме того, выделение памяти будет восстановлено операционной системой после завершения процесса, независимо от того, не угрожаете ли вы системе.
Поскольку вы malloc
редактировали буфер, вы должны фактически free
сделать это самостоятельно. Сохраните SDL_FreeWav
для волновых буферов, переданных вам SDL, с которыми вы закончили (например, от SDL_LoadWav
).
Внутренний на SDL_LoadWav
, будет вызов malloc
по SDL. SDL_FreeWav
- это обертка вокруг соответствующего free
. Такое распределение функций выделения / освобождения является распространенным, поскольку некоторые библиотеки могут реализовывать пользовательские процедуры управления памятью, которые напоминают или переносят malloc
и free
. Они могут даже открывать новые контексты кучи, которые недоступны из стандартных функций и предназначены для частного использования. Нет даже требования, чтобы память выделялась в куче, но это ортогонально вашему вопросу.
Скорее всего, SDL_FreeWav
- это просто прямая free
, но когда библиотека предоставляет функции освобождения, вам следует отдавать предпочтение этим в случае, если поведение отличается.
Если сомневаетесь, всегда вызывайте процедуру освобождения, если вы уверены, что закончили с ресурсом памяти. Двойные free
ошибки являются шумными и обычно генерируют следы стека, которые позволят вам быстро идентифицировать проблему. Другие библиотеки, такие как glib , обычно имеют встроенную диагностику, которая предупредит вас о чрезмерном освобождении. Агрессивное освобождение также помогает в обнаружении логических ошибок: если вы считаете, что с памятью покончено, а с другой частью программы это не так, использование ресурсов потребуется пересмотреть.