Windows用のlibavcodecを使用してavformat_open_input()
いますが、重大なメモリリークが発生しているようです。5,000本のビデオを開くと、OSは、アプリケーションの終了時に解放されない2GBの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
ます。- 同じファイル名で5,000回以上呼び出す
avformat_open_input()
と、メモリがリークしません。 - 組み合わせ
avformat_alloc_context()
とを使用しavformat_free_context()
ます。メモリを解放する組み合わせが見つかりません。