什么时候可以安全地发布国际货币基金组织及其数据
When is it safe to release an IMFSample and its data?
根据这个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
来确保接口指针有效。
堆损坏通常很难进行故障排除,因为不正确的内存访问可能会延迟发生,而不是在错误代码之后立即发生。如果泄漏的媒体样本有助于堆损坏,也许您应该查看早期的数据操作:如何获取媒体样本接口等。
相关文章:
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- C++嵌套if语句,基本货币交换
- 将所有 URL 组织在类中的一个位置
- 如何在 ECS 模型中组织实体?
- 如何根据两个因素组织向量:id 和数量?(C++)
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 什么是非营利组织???我的问题是我不明白为什么有人会使用它
- 如何组织 git 工作流以修复错误并同时引入新功能
- 如何提取由 unordered_map::emplace 重新调整的货币对的值?
- 如何组织从提升日志接收器进行线程安全读取?
- C++如何组织(管理)第三方库
- 如何在github中组织依赖C++的项目
- 使用具有C++继承的 CMake 时,我应该如何组织我的目录结构?
- 组织项目的多平台和易于使用的文件
- C++组织函数流
- 使用级别访问的 C++ 类组织
- 使用 C++ Boost.Test 组织单元测试?
- 什么时候可以安全地发布国际货币基金组织及其数据
- 是国际货币基金组织
- 如何复制国际货币基金组织的大量对象