Итак, вот в чем дело: сначала я подумал, что следующий код был действительно сексуальным для воспроизведения, а затем для освобождения файла wav после его завершения, без остановки машины с помощью команды задержки (при условии, что программа выполняет и будет выполнять какие-то действия). для продолжительности wav-файла, то есть, не выходя, когда вызывается функция):
let rec play_wav file play =
Sdlmixer.open_audio ~freq:44100 ();
let loaded_file = Sdlmixer.loadWAV file in
if play = false then
Sdlmixer.free_chunk loaded_file
else
(
Sdlmixer.play_channel ~loops:1 loaded_file;
play_wav file false
)
;;
Я должен также сказать, что, вероятно, есть лучшие способы выполнить ту же задачу, и она могла бы работать только из-за особенностей машины и т. Д., Но теперь у меня есть лишь академический интерес к вопросу:
(1) файл загружается дважды и освобождается только один раз, создавая таким образом совершенно неуместный код;
или, наоборот,
(2), является ли файл wav, загруженный дважды с помощью Sdlmixer.loadWAV, не , которому назначены два отдельных адреса памяти, malloc и т. Д., Или в логике разделения h = (h1 * emp ) является пост-условием;) Другими словами, если однажды загрузить его, его загрузка снова неэффективна, и одно свободное освобождение освободит чанк, независимо от того, сколько раз он был загружен.
и, наконец,
(3) Sdlmixer.free_chunk даже необходим, поскольку аналогичная функция C free_surface для библиотек OCaml-sdl не реализована.
Запуск valgrind для всего нижеприведенного не указывает на утечки памяти:
(a) программа, содержащая функцию play_wav,
(b) с функцией, которая не освобождает чанк,
(c) с последовательным блоком кода load-play-wait-free_chunk,
(d) с функцией, которая загружает один и тот же файл WAV 1000 раз.
(На самом деле, технически, в каждом случае говорится «определенно потеряно: 337 байт в 4 блоках», не уверен, о чем идет речь, но независимо от того, что valgrind сообщает одинаковые результаты памяти для всех четырех случаев.)
Я предполагаю, что в случае (b) сборщик мусора OCaml позаботится об этом, когда программа завершится, поэтому сложно сказать, все еще загружена ли она и занимает ли она память после завершения этой конкретной подпрограммы, и, следовательно, нуждается в освобождении, так как, когда функция завершает выполнение программы, поэтому, вероятно, было бы неплохо использовать функцию свободного чанка в больших программах.
Во всяком случае, просто было интересно, что люди могут думать и мнения по этому поводу.