2

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

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

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

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

..全てにおいて?

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

4

3 に答える 3

3

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

このスレッドへの返信で、いくつかの Symbian リソースについて言及しました。それらはすべて私にとって最も役に立ちましたが、Accredited Symbian Developer Primerという本は非常に役に立ちました. 手に取って頂ければ間違いなくオススメです。すぐに読めますが、メモリ管理や記述子などの概念を見事に説明しています。

于 2008-12-03T19:40:29.013 に答える
2

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

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

クリーンアップ スタックの実際の使用は、静的関数 CleanupStack::PushL(..) および CleanupStack::Pop / PopAndDestroy によって行われます。

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

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

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

一般的な手法として、呼び出している関数が終了する可能性がある場合(末尾の 'L' で示されます)、削除またはクローズする必要があるもの (など) をクリーンアップ スタックに追加する必要があります。

于 2008-12-03T11:06:31.813 に答える
1

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

恥知らずなプラグイン : この本は、あなたのレベルの n00bness のために特別に書かれました: http://www.quickrecipesonsymbianos.com

于 2008-12-03T14:30:21.277 に答える