После воспроизведения wav-файла нужно ли удалять буфер? - PullRequest
0 голосов
/ 24 июня 2011

Я пытаюсь реализовать классы, реализующие воспроизведение 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 () - см. Выше?Или это где-то выполняется автоматически?

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

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

2 голосов
/ 24 июня 2011

Помните, что C (и что-либо из его реализации) не управляет динамическим распределением памяти автоматически, когда бы вы ни выделили несколько фрагментов памяти (отметьте смещение памяти как USED), вы должны освободить (), когда закончите отметьте, что смещение как UNUSED. Но это НЕ ДОЛЖНО !!!.

1 голос
/ 26 июня 2011

Любой malloc обычно равен free в другом месте того же модуля. Я говорю вообще, потому что вы, возможно, никогда не намереваетесь вернуть память по соображениям производительности или постоянства. Кроме того, выделение памяти будет восстановлено операционной системой после завершения процесса, независимо от того, не угрожаете ли вы системе.

Поскольку вы malloc редактировали буфер, вы должны фактически free сделать это самостоятельно. Сохраните SDL_FreeWav для волновых буферов, переданных вам SDL, с которыми вы закончили (например, от SDL_LoadWav).

Внутренний на SDL_LoadWav, будет вызов malloc по SDL. SDL_FreeWav - это обертка вокруг соответствующего free. Такое распределение функций выделения / освобождения является распространенным, поскольку некоторые библиотеки могут реализовывать пользовательские процедуры управления памятью, которые напоминают или переносят malloc и free. Они могут даже открывать новые контексты кучи, которые недоступны из стандартных функций и предназначены для частного использования. Нет даже требования, чтобы память выделялась в куче, но это ортогонально вашему вопросу.

Скорее всего, SDL_FreeWav - это просто прямая free, но когда библиотека предоставляет функции освобождения, вам следует отдавать предпочтение этим в случае, если поведение отличается.

Если сомневаетесь, всегда вызывайте процедуру освобождения, если вы уверены, что закончили с ресурсом памяти. Двойные free ошибки являются шумными и обычно генерируют следы стека, которые позволят вам быстро идентифицировать проблему. Другие библиотеки, такие как glib , обычно имеют встроенную диагностику, которая предупредит вас о чрезмерном освобождении. Агрессивное освобождение также помогает в обнаружении логических ошибок: если вы считаете, что с памятью покончено, а с другой частью программы это не так, использование ресурсов потребуется пересмотреть.

...