2011-10-07 10 views
1

件名はすべてです。私のアプリケーションを閉じた後、それはいくつかのメモリを持つプロセスのリストにとどまります。私はリークを見つけるためにデバッグのGoogleのperfツールと時間を試してみました。C++ wxWidgets Gui-Appを閉じるとメモリに残ります

これをテストして問題を見つける他のツールはありますか?

ありがとうございます。

答えて

1

私の推測では、最上位のウィンドウとそのすべての子ウィンドウを閉じたが、アプリケーション自体を閉じていないと思います。

あなたのプログラムが「普通の」方法で整理されている場合は起こりませんが、故意にまたは偶然に奇妙な配置が使用された場合、これが起こります。

もちろん、コードをどのように配置したかによって異なります。しかし、ここでは始めるべき提案があります。

通常、アプリケーションを閉じるには、トップレベルウィンドウが閉じたときに通常発生するwxApp :: OnExit()を呼び出します。

wxAppから派生した独自のクラスはありますか?あなたはOnExit()のオーバーライドを持っていますか?そうでない場合は、デバッガを使用して呼び出されているかどうかを確認します。それが呼び出されていない場合は、それが確実に呼び出されるようにしてください。

もう一つのアイデア:アプリケーションが時にトップ終了する場合はtrueを、あなたのトップレベルウィンドウがアプリに

を閉鎖することを確認するには、次のBOOL wxApp :: GetExitOnFrameDelete()constは

戻り値を使用しますレベルウィンドウは が削除され、そうでない場合はfalseです。

これがfalseを返す場合は、それに対応するセットを使用します。

第3のアイデア:トップレベルのウィンドウが開いている間、アプリケーションは終了しません。だから、おそらくあなたは最小化されているか見えないが閉じられていない別のトップレベルのウィンドウを持っていますか? wxDialogまたはWxFrameまたはこれらから派生したウィンドウはトップレベルウィンドウであり、アプリケーションが終了しないようにします。

第4のアイデア:デストラクタが無限ループに入るアプリケーションオブジェクトのグローバルまたは属性はありますか?これらのデストラクタは、ウィンドウが破棄された後に呼び出され、そのうちの1つが返されない場合は、記述した動作が表示されます。

1

wxWidgetのサンプルフォルダを見てみてください。完全なinit/exitアプリケーション・サイクルを含む小さくても完全なアプリケーションがたくさんあります。

サンプルを調べて、アプリのワークフローと比較してください。

+0

これは合理的です。あなたのアプリを書こうとしたばかりの人は、あなたの持っているものを放棄して、それが深刻な問題を抱えていて、必要なものに最も近いサンプルからもう一度やり直すことによって、ベストを尽くすことができます。あなたがあなたのアプリに多くの時間を費やしたなら、これは魅力的ではありません。しかし、おそらく、あなたのアプリは最近まで働いていたので、最近の変更を取り消すだけで済みます。バージョンコントロールシステムを使用しています。 – ravenspoint

1

はい...問題を解決しました。破棄されなかったTopLevelWindow。メモリリーク....愚かな間違い。

関連する問題