播放wav文件后,是否需要删除缓冲区?

时间:2011-06-24 08:33:31

标签: c++ c audio sdl wav

我正在尝试实现实现wav播放的类,如this example中所述。相关的代码部分在这里:

/* 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 个答案:

答案 0 :(得分:3)

不,没有自动完成任务。你必须释放它。

答案 1 :(得分:2)

请记住,C(以及它的任何实现)不会自动管理动态内存分配,无论何时分配了一些内存(将内存偏移标记为USED),当你完成时你应该释放它()备注为UNUSED。但那不是必须!!!。

答案 2 :(得分:1)

同一模块中的任何malloc通常都是free。我通常会说,因为出于性能或持久性原因,您可能永远不会打算回忆。此外,当进程终止时,操作系统将回收内存分配,无论您是否危及系统。

由于 malloc编辑了buf,你实际上应该自己free。保存SDL_FreeWav以获取SDL传递给您的波形缓冲区(例如来自SDL_LoadWav)。

SDL_LoadWav的内部,将是SDL的malloc电话。 SDL_FreeWav是相应free的包装器。这种分配/解除分配函数配对很常见,因为一些库可能实现类似于或包裹mallocfree的自定义内存管理例程。它们甚至可能打开无法从标准函数访问的新堆上下文,并且打算是私有的。甚至没有要求在堆上分配内存,但这与您的问题正交。

SDL_FreeWav可能只是一个直的free,但是当一个库提供释放函数时,如果行为不同,你应该更喜欢那些。

如有疑问,如果您认为已完成内存资源,请始终调用释放例程。双free错误是嘈杂的,通常会生成堆栈跟踪,以便您快速识别问题。其他库(例如glib)通常会有内置诊断程序,提醒您过度热量释放。积极地解除分配还有助于定位逻辑错误:如果您认为已完成内存,但程序的其他部分未完成,则需要重新检查资源使用情况。