Нужно ли удалять буфер после воспроизведения wav-файла?

Я пытаюсь реализовать классы, реализующие воспроизведение wav, как описано в этом примере. Соответствующая часть кода находится здесь:

/* Setup for conversion */
wav_cvt.buf = malloc(wav_len * wav_cvt.len_mult);
wav_cvt.len = wav_len;
memcpy(wav_cvt.buf, wav_buf, wav_len);

/* We can delete to original WAV data now */
SDL_FreeWAV(wav_buf);

/* And now we're ready to convert */
SDL_ConvertAudio(&wav_cvt);

Когда wav-файл заканчивает воспроизводиться (я не собираюсь его воспроизводить снова), нужно ли мне освобождать буфер памяти, который указан с помощью malloc() выше? Или это где-то делается автоматически?


person BЈовић    schedule 24.06.2011    source источник
comment
Независимо от того, что вы malloc, вы должны освободить. Я не уверен в этом конкретном случае, но в целом это симантика.   -  person balki    schedule 24.06.2011
comment
Это должно быть указано в документации SDL_FreeWAV(), однако было бы удивительно (и довольно асимметрично), что SDL требует от вас выделения вручную, но сам позаботится об удалении (как он может знать, как вы выделили свою память?)   -  person ereOn    schedule 24.06.2011
comment
Память @ereOn wav выделяется в SDL_LoadWAV и освобождается с помощью SDL_FreeWAV, но я спрашиваю не об этом. Все говорит о том, что вы (и @Armen) правы.   -  person BЈовић    schedule 24.06.2011
comment
Если вы используете классы, то почему этот вопрос помечен как C?   -  person Tim    schedule 24.06.2011
comment
@Tim Потому что то же самое делается для C. Должна ли эта память с malloc () быть свободной () или нет?   -  person BЈовић    schedule 24.06.2011
comment
@VJo, да, все, что вы сами используете malloc(), вы должны освободить().   -  person Alex B    schedule 24.06.2011
comment
@Алекс Б: s/must/almost always/  -  person Matt Joiner    schedule 26.06.2011
comment
@ Мэтт Итак, я не понимаю. Здесь так или нет?   -  person BЈовић    schedule 26.06.2011
comment
@VJo: Здесь ответ - да. Поскольку вы сами его выделили, вы должны освободить его самостоятельно. Смотрите мой ответ для обоснования.   -  person Matt Joiner    schedule 27.06.2011


Ответы (3)


Нет, ничего не делается автоматически. Вы должны освободить его.

person Armen Tsirunyan    schedule 24.06.2011
comment
Я думал так же, но не смог найти ни примера, ни утверждения, подтверждающего это. Можете ли вы предоставить ссылку, которая поддерживает это? - person BЈовић; 24.06.2011

Помните, что C (и что-либо из его реализации) не управляет динамическим выделением памяти автоматически, всякий раз, когда вы выделяете некоторые части памяти (отмечайте смещение памяти как USED), вы должны free() это, когда вы закончите, чтобы отметить это смещение как НЕИСПОЛЬЗУЕМЫЙ. Но это НЕ ОБЯЗАТЕЛЬНО!!!.

person ajhwb    schedule 24.06.2011
comment
почему бесплатно(); это не обязательно - person Tim; 24.06.2011
comment
@ Тим, ну, это не так, если тебе нравится утечка памяти и всеобщая ненависть. - person Alex B; 24.06.2011

Любой 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