Qtopiaアプリケーションの開発 その3 メモリリーク実験


 new演算子の仕様が気になったんで、ちょっと確かめてみました。

リスト1「HelloQT」

# main.cpp

#include 
#include 

int main (int argc, char *argv[])
{
	QPEApplication hello( argc , argv );
	QLabel *label = new QLabel ("Hello World!",0);
	hello.setMainWidget(label);
	(*label).show();
	return hello.exec();
}
リスト2「HelloQT2」

# main.cpp

#include 
#include 

int main (int argc, char *argv[])
{

	int result;

	QPEApplication hello( argc , argv );
	QLabel *label = new QLabel ("Hello World!",0);
	hello.setMainWidget(label);
	(*label).show();

	result=hello.exec();
	delete label;

	return result;
}

 リスト1はこれまでと同じサンプルソース
 リスト2では、hello.exec()の戻り値を別途、変数に返すようにした上で、終了前に明示的にdeleteをかけるようにしてみました。

 検証は、ホーム画面にそれぞれのアプリケーションを登録後、一旦再起動を行い、システム起動直後の状態から、10回ずつ起動・終了を繰り返します。
 その上で、それぞれのメモリ使用状況を確認すると以下の通りとなりました。

HelloQT (delete処理なし)
 起動前:19184KB
 起動後:19196KB

HelloQT2(delete処理あり)
 起動前:19184KB
 起動後:19196KB

 システムのメモリ使用状況に関しては、キーやペンタップ等の操作自体でも変動します。そのため、起動前の空きメモリ状況は必ずしも一定にはなりません。また、どうもシステム情報自体でも、微妙にメモリリークが発生しているようなので、数値そのものはあくまでも目安に過ぎません。

 ただ、上記の結果を見る限りでは、少なくともdelete処理の有無は必ずしもメモリリークに直結するものでは無さそうですな。
 まぁ、実際、クラス内部でnew演算子使われてたりした場合、それら全てを把握することは困難な訳で、そういう意味ではあんまり神経質になっても仕方無いのかもしれませんが(苦笑)。

 ・・・しかし、起動前後で、総じて空きメモリ減ってるってことは、それ以外のトコでリークが発生してるとも言えるわけで、そっちのが問題かもしんない(^^;)。