我正在尝试实现实现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() - 上面的内存缓冲区?或者它是在某个地方自动完成的?
答案 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
的包装器。这种分配/解除分配函数配对很常见,因为一些库可能实现类似于或包裹malloc
和free
的自定义内存管理例程。它们甚至可能打开无法从标准函数访问的新堆上下文,并且打算是私有的。甚至没有要求在堆上分配内存,但这与您的问题正交。
SDL_FreeWav
可能只是一个直的free
,但是当一个库提供释放函数时,如果行为不同,你应该更喜欢那些。
如有疑问,如果您认为已完成内存资源,请始终调用释放例程。双free
错误是嘈杂的,通常会生成堆栈跟踪,以便您快速识别问题。其他库(例如glib)通常会有内置诊断程序,提醒您过度热量释放。积极地解除分配还有助于定位逻辑错误:如果您认为已完成内存,但程序的其他部分未完成,则需要重新检查资源使用情况。