1

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()ます。メモリを解放する組み合わせが見つかりません。
4

1 に答える 1

0

誰かがこれが役に立つと思った場合に備えて、これに戻ってください。

結局のところ、ファイルを開いたり閉じたりするだけでは、メモリリークが発生します。ただし、(読み取り、シークなど)のような機能を実行する場合、メモリリークは発生しません。

于 2012-12-13T02:54:47.327 に答える