我正在为Windows使用 libavcodec,并且avformat_open_input()
似乎有严重的内存泄漏。如果我打开 5,000 个视频,操作系统会报告应用程序退出时未释放的 2 GB RAM 消耗。这是代码:
AVFormatContext *pFormatCtx = NULL;
AVDictionary *dict = NULL;
int result = 0;
av_register_all();
// open the input video file
IntPtr ip = Marshal::StringToHGlobalAnsi(videoFilename);
const char* filename = static_cast<const char*>(ip.ToPointer());
result = avformat_open_input(&pFormatCtx, filename, NULL, &dict);
if (result < 0) {
Marshal::FreeHGlobal(ip);
return result;
}
Marshal::FreeHGlobal(ip);
avformat_close_input(&pFormatCtx);
return result;
上面的代码位于从 C# 调用的类库中。我正在使用托管 C++ 来调用 libavcodec 库。流程是 C# -> 托管 C++ -> libavcodec。我正在使用 DLL 和动态链接。这是一个单线程应用程序。正如预期的那样,当我使用线程时,泄漏会增加。
我尝试了以下方法:
- 我已经尝试了几个 32 位版本并且内存泄漏是一致的。
- 使用
NULL
而不是&dict
. avformat_open_input()
使用相同的文件名调用5,000 多次,不会泄漏内存。- 使用组合
avformat_alloc_context()
和avformat_free_context()
. 我找不到释放内存的组合。