什么时候发布 IMFSample 及其数据是安全的?

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

根据这个Microsoft tutorial,看起来我们应该在编写示例后立即释放刚刚编写的 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 以确保接口指针有效。

堆损坏通常很难解决,因为不正确的内存访问可能发生较晚,而不是紧跟在不正确的代码之后。如果泄漏的媒体样本有助于堆损坏,也许您应该查看早期的数据操作:如何获取媒体样本接口等。