播放wav文件后,是不是需要删除缓冲区?
Posted
技术标签:
【中文标题】播放wav文件后,是不是需要删除缓冲区?【英文标题】:After playing wav file, do I need to delete the buffer?播放wav文件后,是否需要删除缓冲区? 【发布时间】:2011-06-24 08:33:31 【问题描述】:我正在尝试实现实现 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()-ed 的内存缓冲区?还是在某处自动完成?
【问题讨论】:
无论你使用什么malloc,你都必须释放。我不确定这个具体情况,但总的来说这是语义。 这必须在SDL_FreeWAV()
的文档中指定,但是令人惊讶的是SDL
要求您手动分配但自己负责删除(它怎么能知道你是如何分配内存的吗?)
@ereOn wav 内存在SDL_LoadWAV
中分配,并用SDL_FreeWAV
释放,但这不是我要问的。一切都告诉你(和@Armen)是对的。
如果您使用的是 classes 那么为什么这个问题被标记为 C
@Tim 因为对 C 也做了同样的事情。这个 malloc()-ed 内存应该是 free()-ed 吗?
【参考方案1】:
不,没有任何事情是自动完成的。你必须释放它。
【讨论】:
我也这么认为,但我找不到可以支持它的示例或声明。你能提供一个支持它的链接吗?【参考方案2】:请记住,C(以及它的任何实现)不会自动管理动态内存分配,只要您分配了一些内存(将内存偏移标记为已使用),您应该在完成后释放()它将该偏移量标记为 UNUSED。但这不是必须的!!!。
【讨论】:
为什么是free();不是必须 @Tim,好吧,如果您喜欢泄漏内存并被普遍讨厌,那不是。【参考方案3】:任何malloc
通常是free
在同一模块的其他地方。我说一般是因为您可能永远不会出于性能或持久性的原因而打算归还内存。此外,无论您不会危及系统,当进程终止时,操作系统将回收内存分配。
既然你malloc
了这个buf,你实际上应该自己free
它。保存 SDL_FreeWav
用于 SDL 传递给您的已完成的波形缓冲区(例如来自 SDL_LoadWav
)。
SDL_LoadWav
的内部,将是 SDL 的 malloc
调用。 SDL_FreeWav
是对应 free
的包装。这种分配/解除分配函数配对很常见,因为某些库可能会实现类似于或包装malloc
和free
的自定义内存管理例程。它们甚至可能会打开标准函数无法访问的新堆上下文,并且是私有的。甚至没有要求在堆上分配内存,但这与您的问题正交。
SDL_FreeWav
很可能只是直接的free
,但是当库提供释放函数时,您应该更喜欢那些以防行为不同。
如有疑问,如果您认为已完成内存资源,请始终调用释放例程。双重free
错误很嘈杂,通常会生成堆栈跟踪,让您快速识别问题。其他库,例如glib,通常会有内置的诊断功能,会提醒您过度释放分配。积极地解除分配也有助于定位逻辑错误:如果您认为您已经完成了内存,但程序的其他部分还没有完成,则需要重新检查资源使用情况。
【讨论】:
以上是关于播放wav文件后,是不是需要删除缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章