4

シャットダウン時に、特定のオブジェクトの3つがリークしているというメモリリークメッセージが表示されます。ただし、これには2つの問題があります。

  1. それは断続的にのみ発生します。プログラムを実行し、まったく同じ一連の手順を実行して(データファイルを開き、表示して、再度シャットダウンする)、メッセージが表示される場合と表示されない場合があります。これらのコードパスに沿って、random()またはその他の「非決定論的」ロジックを呼び出す必要はありません。

  2. コードレビューによると、報告されたメモリリークは不可能です。オブジェクトは特定のクラス内でのみ作成され、そのクラスのデストラクタ内で適切に解放されます。(そして、親クラスの3つ以上のオブジェクトをインスタンス化します。また、クリーンアップ中に例外が発生することはありません。)

このクラスのコンストラクタとデストラクタにトレース出力を追加すると、メモリマネージャが別の方法で報告している場合でも、作成されたすべてのオブジェクトが破棄されていることがわかります。したがって、これは誤検知であると結論付けることしかできません。ただし、コンストラクターに「RegisterUnexpectedMemoryLeak(self)」を追加すると、メッセージが消えます。

誰かが以前にこのようなものを見たことがありますか?何がそれを引き起こしているのか考えていますか?オブジェクトがリークしていない可能性があると確信しているので、代わりに何が起こっているのでしょうか。

4

2 に答える 2

7

新しいFastMMを使用し、リンカーオプションでマップファイルの作成を有効にし、条件付きシンボルFullDebugModeを定義して、プログラムを再構築します。次に、手順を実行します。プログラムの終了時に、リークされたオブジェクトがプログラムのどこで構築されたかに関する情報を含むファイルprogramname__MemoryManager__EventLog.txtを生成する必要があります。

于 2008-11-03T03:52:51.220 に答える
0

同じ機能にあることが確実なメモリリークを作成し、メモリマネージャが報告する内容を監視します。

于 2008-11-03T03:33:14.707 に答える