1

我正在为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(). 我找不到释放内存的组合。
4

1 回答 1

0

回到这一点,以防有人发现这很有用。

事实证明,如果我只是打开和关闭一个文件,就会出现内存泄漏。但是,如果我执行(读取、查找等)之类的功能,则不会出现内存泄漏。

于 2012-12-13T02:54:47.327 回答