그래서 여기에 거래가 있습니다 : 처음에는 지연된 명령을 사용하여 컴퓨터를 정지시키지 않고 wav 파일을 재생 한 다음 wav 파일을 해제하는 것이 정말 섹시한 코드라고 생각했습니다 (프로그램이ocaml sdl 청크 가비지 수집
이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
)
;;
나는 또한 같은 작업을 달성 아마도 더 나은 방법이 말을해야, 그것은 수도 : 및 예) 함수가 호출 될 때, 종료하지, WAV 파일의 기간 동안 물건을합니다 기계 특정 기능 등으로 인해서 만 작동하지만 지금은 다음에 대한 학문적 호기심이 있습니다.
(1) 파일이 두 번로드되고 한 번만 해제되므로 분명히 알려지지 않은 코드가 생성됩니다.
거나 도리어,
WAV 파일이 Sdlmixer.loadWAV 의해 회로드 여부 (2)가 하지 할당 된 두 개의 분리 된 메모리 어드레스, mallocs 등 또는 분리 논리 H =이다 (H1 * emp)은 사후 조건입니다. 즉, 한번로드되면 다시로드하는 것은 작동 상 효과가 없으며 한 번만로드하면 몇 번로드되었는지에 관계없이 청크가 해제됩니다.
및 마지막
여부OCaml의 SDL-라이브러리에 대한 유사한 free_surface C의 기능이 구현되지 않기 때문에 (3)가 Sdlmixer.free_chunk도 필요하다.
아래의 모든에 Valgrind의를 실행하면 메모리 누수를 표시하지 않는 것 :
(가) play_wav 기능을 포함하는 프로그램,
(b)는 덩어리를 확보하지 못하는 기능,
동일한 WAV 파일 1000 번을로드하는 기능을 갖는 연속 부하 플레이 웨이트 free_chunk 코드 블록 (c)
(d).
:
는 (그 약하지만 관계없이 Valgrind의 네 가지 경우에 동일한 메모리 결과를보고 무엇인지 확실하지 않은 사실, 기술적으로, 모든 경우에 그것은 "337 바이트를 4 개 블록에 확실히 손실"상태.) OCaml의 가비지 컬렉터가 프로그램을 종료 할 때 (b) OCaml의 가비지 컬렉터가 처리한다고 상상해보십시오. 따라서 함수가 끝나면 특정 루틴이 끝나고 메모리를 차지하는 것이 끝나면 freeing이 필요하다는 것을 말하기 어렵습니다. 프로그램이 종료되므로 큰 프로그램에서 free chunk 기능을 사용하는 것이 좋습니다.
어쨌든, 사람들의 생각과 의견이 궁금했을뿐입니다.
유럽인들이 잠에서 깨어나 약간의 피드백을 얻을 때까지 기다려야 할 것 같아요.) – mbunit
sdl 바인딩의 구현을보세요 – ygrek