根据这个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
函数)并将它们写在自己的好时机中..因此,当我在之前发布样本时发生堆损坏确实有意义接收器编写者有机会写它。这是发生了什么?如果是这样,我应该如何负责任地清理内存?我是否需要在接收器编写器上放置一个异步调用,并使用它来监视何时完成采样,以便释放内存?这似乎很麻烦,而且我从来没有在任何微软的例子中看到过这样做,所以我有点想知道该怎么做。
答案 0 :(得分:3)
如果接收器需要延长对象的使用寿命,尤其是早期发布的媒体示例是可以的。对于异步操作,它可以而且应该执行额外的AddRef
/ Release
以确保接口指针有效。
堆损坏通常很难排除故障,因为不正确的内存访问可能会发生得太晚,而不是在错误的代码后立即进行。如果泄漏的媒体样本有助于堆损坏,那么您可能应该查看以前的数据操作:如何获取媒体样本界面等。