トップ 一覧 ソース 検索 ヘルプ RSS ログイン

▽こころキット

Qtのメモリリークメモ

『メモリリークメモ』って変な日本語だな。それはさておき(´∀`;)

Qtでは、どこかのオブジェクトが破棄されるとき、子オブジェクトも破棄してくれるからメモリ管理が楽になるらしい。・・・本当にそうなのか?

明示的に破棄しないケース

テスト用のコードはこんな感じ。

01|#include <QApplication>
02|#include <QHBoxLayout>
03|#include <QLabel>
04|
05|#include "skQtLib.h"
06|
07|int         main( int argc,char* argv[] )
08|{
09|    //      メモリリークを報告させる
10|    
11|    skDebugReport();
12|
13|    //      アプリケーションクラスを作成
14|
15|    QApplication    app( argc,argv );
16|
17|    //      ラベルをレイアウトに追加
18|
19|    QHBoxLayout*    lay = new QHBoxLayout();
20|    QLabel*         lab = NULL;
21|
22|    lab = new QLabel( "<center>left label</center>" );
23|    lay->addWidget( lab );
24|
25|
26|    lab = new QLabel( "<center>reft label</center>" );
27|    lay->addWidget( lab );
28|
29|    //      メインウィンドウを作成
30|
31|    QWidget*    wi  = new QWidget();
32|    wi->setWindowTitle( "test01a" );
33|    wi->setLayout( lay  );
34|    wi->show();
35|
36|    //      イベントループを回す
37|
38|    return   app.exec();
39|}

ソースコードはQtのサンプルとしてありがちな形。メモリリークを報告させるために、軽く仕込みがしてあるけど本題と関係ないので省略。

これで実行すると山ほどのメモリリークがw

スレッド 'Win32 スレッド' (0xa00) はコード 0 (0x0) で終了しました。
Detected memory leaks!
Dumping objects ->
{14311} normal block at 0x0279C700, 252 bytes long.
 Data: <            p   > 01 00 00 00 88 DD DC 00 C8 A8 DC 00 70 A9 DC 00 
{14310} normal block at 0x0279B988, 104 bytes long.
 Data: <                > 03 00 00 00 01 00 00 00 01 00 00 00 FF FF 00 00 

明示的に破棄してるケース

ソースは修正点だけ。

36|    //      イベントループを回す
37|
38|    int     rc  = app.exec();
39|
40|    //      メインウィンドウを破棄
41|
42|    delete  wi;
43|    
44|    return   rc;
45|}

これで、メモリリークは出なくなった。ポイントはdeleteしてるのがメインウィンドウだけってこと。この時点で『QWidget → QHBoxLayout → QLabel×2』と親子関係ができてるから、QWidgetさえdeleteすれば、すべてdeleteされるってことだな。

結論

  • メインウィンドウが勝手にdeleteされることはない
  • 親オブジェクトを破棄すれば、子オブジェクトも破棄される

テストに使ったソースコードはこちら:test01.zip


(2009/11/06 メモ,Qt

Visual Studio 2008のメモ(その1)

コンパイル終了時に音を鳴らす

昔は当たり前のようにできてたんだけど、なぜか、Visual Studio 2005ではできなかった設定。Visual Studio 2008では、何事もなかったかのようにできるようになってるw

ss001.png

『コントロールパネル』→『サウンド』→『サウンド』を開いて“プログラムイベント”の中から対応する項目を探して好きな音源を設定。これだけ。

プロジェクトによってはインクリメンタルリンクが効かない

まともな修正はしてないのに、毎回、フルリンクされてしまう現象に対応。ちょっと変わった手段でプロジェクトを作るとこうなる?

ss002.png

プロジェクトのプロパティで“インクリメンタルリンクを有効にする”の値を“インクリメンタルリンクを行う”に修正する。運がよければこれで治る。


(2009/11/06 メモ

qmakeの使い方メモ

Qtのプロジェクトファイルを作成

> qmake -project [-o filename]

フォルダの中のソースファイルを検索して、プロジェクトファイルを作成する。出力するファイル名を指定しなかった場合は、ソースが入ってるディレクトリの名前が使われる。

Makefileの作成

> qmake [filename]

プロジェクトファイルからMakefileを作成。ファイル名を指定しなくても、それなりに検索して使ってくれる。便利便利。

Visual Studioのプロジェクトファイルを作成

> qmake -tp vc [filename]

QtのプロジェクトファイルからVisual Studioのプロジェクトファイルを生成してくれる。インクルードパスの指定もしてあって便利。

とりあえず、これだけ覚えてれば十分・・・ たぶん(´∀`;)


(2009/11/05 メモ,Qt

入門 Qt4プログラミング

lqp_a.jpg lqp_b.jpg

著者:Jasmin Blanchette、Mark Summerfield
翻訳:杵渕聡、杉田研治

 感想

Qt3向けだった『Qt GUIプログラミング』を、Qt4に向けて手直しした本。これからQtのプログラムを始めたい人に最適。

あくまで入門って言うことで、基本的な機能の説明がほとんど。XMLやネットワークはQtの場合は基本機能だしね。

できればWebKitとかの話もほしかったけど・・・ 応用は自分で調べろってことかな。

どうして、ソフトバンクパブリッシングからオライリーに移籍したのかは謎w


(2009/11/05 書評,Qt

Qt GUIプログラミング

qgp_a.jpg qgp_b.jpg

著者:Jasmin Blanchette、Mark Summerfield
翻訳:杵渕聡、杉田研治

 感想

Qt3のよくできた入門書。

Qt4が出る前に書かれた本だから当たり前だけど、ほとんどがQt3の話。Qt4については、新機能の概要やQt3からの移植について多少触れられてる程度。

これを読んじゃうと中途半端にQt3の知識が入っちゃうから、これからQtをはじめようと思う人にはお勧め出来ない。

というか、これからはじめるなら『入門 Qt4プログラミング』をどうぞ。こっちは基本的に同じ内容だけど、Qt4向けに書き直されてる。


(2009/11/05 書評,Qt

Qtのインストールメモ

Qtをインストールしたときのメモ。いろいろ試行錯誤した結果、結局はシンプルなインストール手順になった(´∀`;)

インストールした環境はこんな感じ。

種類内容
OSWindows 7 Professional (64bit)
コンパイラVisual Studio 2008 sp1
Qtのソースqt-win-opensource-src-4.5.3.zip

コンパイルに使ったのはx86環境。x64でもコンパイル出来るんだろうか?

Qtのソースは公式サイトから何種類か落とせるけど、開発環境もMinGWもいらないのでソースコードのみのアーカイブをダウンロード。これは、ftpから探す方が速いかも。

 準備

アーカイブを展開

展開先をそのままインストール先にするので、どこに展開するかは慎重に。

今回は『C:\devenv\qt\qt4.5.3』に展開。

環境変数を設定

Qtの環境で必要になる環境変数を設定しておく。

項目内容
PATHC:\devenv\qt\qt4.5.3\bin を追加
QMAKESPECwin32-msvc2008

qmakeをいじる

話せば長くなるんだけど、*.pdbを消されるのが嫌なのでqmakeを修正。もうちょっとましなやり方がありそうな気がするんだが・・・ これが一番楽だしw

ファイル:C:\devenv\qt\qt4.5.3\qmake\generators\win32\msvc_nmake.cpp
修正箇所:line: 216-221
修正後のソース:

    if(project->isActiveConfig("debug")) {
//      project->values("QMAKE_CLEAN").append(project->first("DESTDIR") + project->first("TARGET") + version + ".pdb");
        project->values("QMAKE_CLEAN").append(project->first("DESTDIR") + project->first("TARGET") + version + ".ilk");
//      project->values("QMAKE_CLEAN").append("vc*.pdb");
        project->values("QMAKE_CLEAN").append("vc*.idb");
    }

つまり、『.pdb』関係の行をコメントアウト。

 release版をコンパイル

メインのライブラリの他、ツール、デモ、サンプルなど、まとめて全部コンパイル。

configure

> cd C:\devenv\qt\qt4.5.3
> configure -release -shared -D _CRT_SECURE_NO_WARNINGS

手元の環境で15分ちょっと。

make

> nmake

makeだけで1時間40分ぐらい。この時点で約1.38GB。

clean

> nmake clean

この時点で約535MB。

デモやサンプルの動作を確認。

 debug版をコンパイル

開発に必要となるライブラリをコンパイル。

configure

> cd C:\devenv\qt\qt4.5.3
> configure -debug -shared -D _CRT_SECURE_NO_WARNINGS

15分程度。

nmake

> nmake sub-src

ターゲットはメインのライブラリだけ。それでも40分ぐらいかかった。この時点で約2.2GB。

clean

> nmake clean

この時点で約965MB。適当にコンパイルのテストをしておく。Visual Studioからデバッグ実行して、Qtの中まで追いかけられればok。たぶん。

 不要なファイルを削除

ここから先は気分次第で。

中身が空のディレクトリを消す

中身が空のディレクトリが3000近く残ってるので削除。さくっと。

Makefileを消す

Makefileだけで100MB使ってるので削除。日時でソートして、インストール中に作られた物だけを消すのがポイント?

*.vcprojと*.slnを消す

Makefileと同じようにして削除。

さらに無駄なファイルを消す

src\3rdparty\webkit\WebCoreに入ってるChangeLogを削除。これだけで17MBも使ってるという・・・ WebKit、恐るべし。

これだけ削除して約834MB。まぁ、こんな物かな? あとは、好みに応じてqmakeを元に戻しておきましょう。


(2009/11/03 メモ,Qt

自分でコンパイルした環境でRubyGemsを動かすメモ

自分でコンパイルしたRuby 1.9.1の環境でRubyGemsを使ってると、『zlibのロードができないよ!』って怒られたので対応方法をメモ。

1.zlibをダウンロード

zlibの公式サイトから必要なファイルをダウンロード。

とりあえず、今回はDLLを使用。公式サイトが異常に重かったのでこっそり転載。

zlibのDLL:zlib123-dll.zip
zlibのソースコード:zlib123.zip

ダウンロードしたDLLを適当なフォルダに展開しておく。
今回の展開先は『C:\devenv\zlib』。

2.extconf.rbを実行

>cd C:\devenv\ruby-1.9.1-p243\ext\zlib
>ruby extconf.rb --with-zlib-include=C:\devenv\zlib\include --with-zlib-lib=C:\devenv\zlib\lib

1で展開したフォルダをオプションで指定。

3.make&install

>nmake
>nmake install

普通に実行。

4.DLLをコピー

zlib1.dllをrubyのbinにコピーしておく。

>copy C:\devenv\zlib\zlib1.dll c:\devenv\ruby\bin

RubyGemsを動かして動作を確認。無事に動けばok。たぶん。


(2009/11/01 メモ,Ruby

Rubyのインストールメモ

Rubyをインストールしたときのメモ。といっても、README.win32に書かれてるままですが(´∀`;)

インストールした環境はこんな感じ。

種類内容
OSWindows 7 Professional (64bit)
コンパイラVisual Studio 2008 sp1
Rubyのソースruby-1.9.1-p243.zip

ちなみに、コンパイルに使ったのはx86環境。

インストール時の配置はこんな感じ。

用途ディレクトリ
展開先C:\devenv\ruby-1.9.1-p243
ビルド元C:\devenv\ruby-1.9.1-p243
インストール先C:\devenv\ruby

1.ビルド元でconfigureを実行

>cd C:\devenv\ruby-1.9.1-p243
>win32\configure --prefix=/devenv/ruby

2.とりあえずmake

>nmake

手元の環境で16分ほどかかった。tkのコンパイルが長い?

3.テスト

>nmake test

bootstraptest.tmpでエラーが出るけどテストは通る。

4.インストール

>nmake install

これで、展開先は消してもOK。たぶん。

5.環境変数を設定

Pathに『C:\devenv\ruby\bin』を追加。
RUBYOPTととして『-Ks』を作成。

これで終了。


(2009/11/01 メモ,Ruby

Mac OS Xでcgiを動かすメモ

Snow Leopardで、ユーザーのディレクトリでcgiが動くように設定したときのメモです。

作業の内容としては『/private/etc/apache2/』にある[ユーザー名].conf([ユーザー名]の部分にはユーザー名が入ります)を編集して、Web共有を立ち上げなおすだけ。ただ、[ユーザー名].confは直接編集できないため、ちょっと面倒な手順を踏みます。

1.[ユーザー名].confをコピー

[ユーザー名].confのコピーを作成します。今回はデスクトップに作成。

cp /etc/apache2/users/[ユーザー名].conf ~/Desktop/

ついでに、バックアップを作成。何かおかしな事が起きたら、このファイルに戻しましょう。

cp /etc/apache2/users/[ユーザー名].conf ~/Desktop/[ユーザー名].conf.org

この時点での、[ユーザー名].confの中身はこんな感じ。

<Directory "/Users/[ユーザー名]/Sites/">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

2.コピーした[ユーザー名].confを編集

デスクトップにある[ユーザー名].confを以下のように編集します。

<Directory "/Users/[ユーザー名]/Sites/">
    AddType text/html .shtml
    AddHandler server-parsed .shtml
    AddHandler cgi-script .cgi
    Options Indexes MultiViews Includes ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

※編集後に保存するとき、改行コードをLFにすることに注意

3.編集した[ユーザー名].confで元のファイルを上書き

sudoを使って上書きコピーします。

sudo cp ~/Desktop/[ユーザー名].conf /etc/apache2/users/[ユーザー名].conf

パスワードを聞かれるので、自分のパスワードを入力します。

4.Web共有を立ち上げなおす

システム環境設定の共有画面で、Web共有を一度オフにして、もう一度オンにします。

5.動作確認

適当なcgiを設置して、動作を確認しましょう。うまく動けばOK(o^-')b


(2009/10/11 メモ

[ 1 2 3 4 5 6 ]