質問

最初に動作するSymbianアプリケーションをほぼ終了しましたが、急いで学習したことで、メモリ管理とスタックのプッシュとクリーンアップにほとんど注意を払っていませんか?

ここで使用するベストプラクティスのいくつか、そしておそらく最高のリーク検出/メモリプロファイリングツールの方向性について誰か教えてください。

たとえば、関数内でTDesCまたはTPtrC16を取得した場合、それらを最適な方法でクリーンアップするにはどうすればよいですか?

TPtrC16 temp = ...
temp.CleanupClosePushL();
CleanupStack::PopAndDestroy()

..すべてのために

ありがとうございます。ご容赦ください。私は自白したSymbian n00bです。

役に立ちましたか?

解決

過去に SymbianのHookLogger を使用してトレースしましたメモリリークを調査します。それは最高ではありませんが、確かに役立ちます。また、ヒープマーカーは、アプリケーションを終了するたびにメモリリークが発生した場合にALLOCパニックを発生させます。それらのパニックが提供する情報はほとんど役に立たないが、どこかにメモリリークがあることを示している。そこから、HookLoggerなどのツールを使用して、リークが導入されるコードの部分を絞り込むことができます。

いくつかのSymbianリソースに言及しましたこのスレッドへの返信 。これらはすべて私にとって最も有用でしたが、認定Symbian開発者向け入門は非常に役立ちます。あなたがそれを手に入れることができれば、私は間違いなくそれをお勧めします。すぐに読むことができますが、メモリ管理や記述子に関するものなど、概念を見事に説明しています。

他のヒント

スタックに保存されているものは、クリーンアップスタックに保存する必要はありません(特別な処理(Rクラスなど、以下を参照)が必要な場合を除く)

クリーンアップスタックは、脱退(例外を考える)が発生したときにオブジェクトを削除するためのものです。そうしないと、メモリがリークします。

クリーンアップスタックの実際の使用は、静的関数CleanupStack :: PushL(..)およびCleanupStack :: Pop / PopAndDestroyを使用することです。

RFile、RFsなどの一部のクラスは、削除するのではなく閉じる必要があるため、これらの関数の:: Close関数を呼び出すため、グローバル関数CleanupClosePushL()を使用する必要があります。休暇、代わりにクラスの:: Close関数を呼び出します。

メモリリークのコードを確認するには、マクロ__UHEAP_MARKを使用できます。および__UHEAP_MARKEND;これにより、これら2つの呼び出しの間からヒープ上に何も残っていないことが確認されます。

CActive's :: RunLのクリーンアップスタックに何かを残すと、アクティブなスケジューラがパニックします。

一般的な手法として、呼び出している関数が(末尾の 'L'で示される)残すことができる場合( )、削除または閉じる(など)必要があるすべての関数を追加する必要がありますスタックをクリーンアップします。

Symbian C ++のCleanupStackとメモリ管理について知る必要があるすべてを適切に説明するには、10ページ弱かかります。

恥知らずなプラグイン:この本は、n00bnessのレベルに特化して書かれています。 http://www.quickrecipesonsymbianos.com

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top