什么时候可以安全地发布国际货币基金组织及其数据

When is it safe to release an IMFSample and its data?

本文关键字:基金组织 货币 数据 布国际 安全 什么时候      更新时间:2023-10-16

根据这个Microsoft教程,看起来我们应该在编写示例后立即发布刚刚编写的 IMFSample 及其缓冲区:

// Send the sample to the Sink Writer.
if (SUCCEEDED(hr))
{
    hr = pWriter->WriteSample(streamIndex, pSample);
}
SafeRelease(&pSample);
SafeRelease(&pBuffer); 

但有时我在执行此操作时会出现堆损坏错误......如果我省略对 SafeRelease 示例和缓冲区的调用,我会泄漏内存,但我不会收到堆损坏错误。 据我了解,IMFSinkWriter 将发送给它的样本排队(使用 WriteSample 函数)并在自己的好时机编写它们。因此,当我在接收器编写器有机会编写示例之前发布示例时,确实会发生堆损坏。 这是正在发生的事情吗? 如果是这样,我应该如何负责任地清理内存? 是否需要在接收器编写器上放一个异步回调,并使用它来监视示例何时完成,以便释放内存? 这似乎很麻烦,而且我从未在任何Microsoft的例子中看到过这样做,所以我有点想知道该怎么做。

这里提前发布媒体示例是可以的,如果 sink 需要延长对象的生命周期,特别是对于异步操作,它可以而且应该做额外的AddRef/Release来确保接口指针有效。

堆损坏通常很难进行故障排除,因为不正确的内存访问可能会延迟发生,而不是在错误代码之后立即发生。如果泄漏的媒体样本有助于堆损坏,也许您应该查看早期的数据操作:如何获取媒体样本接口等。