Windows Media Foundation MFCreateSourceReaderFromURL 函数中的内存泄
Memory leak in Windows Media Foundation MFCreateSourceReaderFromURL function. Any alternative functions?
在Windows 10上,Windows Media Foundation函数(MFCreateSourceReaderFromURL(中存在错误。每次使用后都会导致内存泄漏。 是否有任何替代功能可以在没有内存泄漏的情况下使用?Windows Media 基础似乎充满了错误,那么我该如何避免它?
证明内存泄漏,运行以下代码 (x86( 并每秒观察到巨大的内存泄漏:
#include <mfapi.h>
#include <mfidl.h>
#include <mfreadwrite.h>
#pragma comment (lib, "Mfreadwrite.lib")
#pragma comment (lib, "Mfplat.lib")
#pragma comment (lib, "mfuuid.lib")
int main()
{
while (true)
{
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
return 1;
}
if (FAILED(MFStartup(MF_VERSION)))
{
return 1;
}
IMFSourceReader* sourceReader = nullptr;
if (FAILED(MFCreateSourceReaderFromURL(L"C:/any_audio_file.wav", nullptr, &sourceReader)))
{
return 1;
}
sourceReader->Release();
MFShutdown();
CoUninitialize();
}
return 0;
}
题外话:太沮丧了。我使用 DirectShow 只是为了发现 RenderFile 网络音频流中存在错误。几天后更改为替代(Windows Media Foundation(,发现那里有内存泄漏。Microsoft。
编辑:仅当文件名末尾没有 *.mp3(并且内容为 mp3(时,才会发生内存泄漏。或者,如果文件名末尾没有 *.wav(并且内容是波浪( 例: 有mp3文件"音乐.mp3"。将名称更改为"音乐"或"音乐.wav"。将发生内存泄漏。
根据代码,您在一个线程中调用了 APIMFSshutdown和CoUninitialize多个时间。每个线程只能调用一次这两个 API。
下面是修改后的代码,它与更真实的使用场景相匹配。您可以将此代码构建为发布(而不是调试(并运行它,您将看到在 60 秒内只有少量内存增加 (150 kb(。小幅增加是由于 DLL 缓存的大小增加(预期(和正在创建的工作队列数增加(预期(。因此,目前我没有看到任何内存泄漏的迹象。
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) // <- Should only be called once per thread
{
return 1;
}
if (FAILED(MFStartup(MF_VERSION))) // <- Should only be called once per thread
{
return 1;
}
while (true)
{
IMFSourceReader* sourceReader = nullptr;
OutputDebugString(L"MFCreateSourceReaderFromURL rn");
if (FAILED(MFCreateSourceReaderFromURL(L"maybe-next-time", nullptr, &sourceReader)))
{
return 1;
}
sourceReader->Release();
Sleep(100); // <- Make sure to yield the processor before continuing with the loop
}
MFShutdown(); // <- Should only be called once per thread
CoUninitialize(); // <- Should only be called once per thread
如果你们端的内存泄漏不是由此引起的,你介意分享一个可以代表真实单词用法的代码示例吗?
这是Windows Media Foundation Microsoft中的一个错误。评论中也证实了这一点。
溶液:
不要在专业软件中使用Microsoft Windows Media Foundation,因为它充满了隐藏的错误和内存泄漏。
- 从构造函数抛出异常时如何克服内存泄漏
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- std::unordered_map析构函数不释放内存?
- 为什么类和 main() 函数中也有动态内存分配
- 为什么此函数会导致内存泄漏?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 在函数中分配内存时出现问题
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 在构造函数中分配内存失败是如何冒泡的
- 将 vector<vector<int>> 传递到函数中会产生内存错误
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 如何在 c++ 中的析构函数中正确释放合并 LL 的内存?
- 为什么 free() 函数不将内存返回给操作系统?
- 从函数返回时C++内存管理
- 无法在循环中动态分配内存(函数会吃掉所有内存)
- 在c++中使用C动态内存函数避免分段错误
- 用C/ c++在Windows上解压缩内存函数