私は現在、大規模なアプリケーション プロジェクト (C++ で記述) に取り組んでいます。このプロジェクトは、少し前にゼロから開始されたものであり、メモリ リークのチェックのまとめを行うことが必須になった時点に達しました。
このアプリケーションは Ubuntu Linux で実行され、多くのマルチメディア コンテンツがあり、3D グラフのレンダリング、ウィンドウ、オーディオ、ムービーの再生など、さまざまな目的で OpenGl、SDL、および ffmpeg を使用します。それはビデオゲームではありませんが、ビデオゲームと考えることができますが、アプリケーションの義務はビデオゲームと見なすことで単純化できます。
現在、メモリリークがまだあるかどうかを判断するのに少し無知です。過去に、すでに一部を特定して削除していました。しかし最近では、アプリケーションはほぼ完成しており、私たちが実行したテストでは正確に把握できない結果が得られています。
私が最初にしたことは、Valgrind を介してアプリケーションを実行しようとすることでした...残念ながら、valgrind 環境で実行するとアプリケーションがクラッシュします。さまざまな場所でクラッシュするため、「非決定論的」にクラッシュします。そこで、潜在的なリークの原因を簡単に特定するために Valgrind を使用することをあきらめ、free と top の 2 つの Linux コマンドを使用することになりました。
free は、アプリケーションの実行中にシステム メモリの使用状況を調査するために使用されています。
top は「-p」オプションとともに使用され、実行中のアプリケーション プロセスのメモリ使用量を調べます。
出力フォーム top and free は、後処理のためにファイルにダンプされています。質問の下部にリンクされているデータを使用して 2 つのグラフを作成しました。
テスト ケースは非常に単純です。アプリケーションが既に起動され、コマンドを待機しているときに、メモリに関するデータがプローブされます。次に、常に同じことを繰り返し実行する一連のコマンドを開始します。アプリケーションは、大量のマルチメディア データを RAM にロードしてからダウンロードすることが期待されています。
残念ながら、グラフは私が期待していたものを示していません。メモリ使用量は 3 つの異なる段階を経て増加し、その後停止します。メモリは明らかに決して解放されていません。これは、巨大なメモリ リークがあったことを示唆しています。これはまったく問題ありません。これは、メディアによって消費されたメモリを解放していない可能性が非常に高いことを意味するためです。
しかし、最初の 3 つのステップの後...メモリ使用量は安定しています...これ以上大きなステップはありません...予想されるデータのロードとアンロードに対応するわずかな上下があります。ここで予期しないのは、ロード/アンロードされるはずのデータが RAM の 100 分の 1 のメガバイトを占めていることです。
私は現在、これらのデータを解釈する上でかなり無知です。
誰にもいくつかのヒントや提案がありますか? 私は何が欠けていますか?巨視的なメモリリークの存在を確認するために使用している方法は完全に間違っていますか? メモリ リークをチェックするための Valgrind 以外の (できれば無料の) ツールを知っていますか?