我应该在释放 IMFSample 对象之前释放 IMFSample 中的缓冲区吗?

Should I release the buffers within IMFSample before I release the IMFSample object?

我找不到任何关于在实际释放 IMFSample 本身之前释放 IMFSample 中的缓冲区的要求的信息。如果我只释放 IMFSample 会自动释放它的缓冲区吗?我正在编写一个视频播放器应用程序,并且从 IMFSourceReader::ReadSample 收到了一个示例。当我看到代码 运行ning 时,我发现 VS2017 中的内存使用量略有增加,我不确定这是否是泄漏。我使用的代码基于此 post 中的示例代码。

我发现 IMFSample::RemoveAllBuffers 方法可能会或可能不会释放缓冲区,它没有在文档中指定。也许这需要在发布 IMFSample 之前使用? https://msdn.microsoft.com/en-us/library/windows/desktop/ms703108(v=vs.85).aspx

(我也在我的研究中 运行 跨越另一个相关 post 但我认为它不适用于我的问题:)

谢谢!

适用常规 COM 接口指针管理规则:您只需释放 IMFSample 指针即可。

在某些情况下,您释放样本指针不会导致实际释放内存,因为样本可能被合并:释放的样本对象返回到其父池并准备好重新使用。

重复一下 Roman 所说的,如果你只是处理一个 IMFSample,你只需要释放这个 IMFSample。如果您在 IMFSample 上添加 Buffer,则必须将其删除(我同意这还不清楚,但如果此时删除缓冲区,这将导致处理 IMFSample 的组件出现问题,并且之后将找不到缓冲区)。也就是说,如果没有人在正确的时间调用 RemoveAllBuffers,这种设计可能会导致问题。

不同的组件不应在同一个 IMFSample 上使用 AddBuffer。但这是可以做到的。

这是糟糕的内存管理设计。你必须处理它。

最后但并非最不重要。

根据 Microsoft 的说法,您必须释放缓冲区(之前或之后都没有关系)。 参见:Decode the audio