Mail: Pass:
前月  2008年6月  翌月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

links

 びびすけさんのページ
 体重・走距離分析
 月間・靴・コース走距離
 タイムトライアル分析
 速度・心拍数分析
 自転車・月間・コース走距離
 オセロ勝敗・レート分析
 ViVi web site

新着日記

 はじめての AIR プログラム(汎用…
 モカ将棋 0.005 リリース
 座標がずれる
 壁にぶちあたった
 Laramie V1 に勝ち越し!
 vs Laramie V1 10番勝負
 モカ将棋10番勝負 (2)
 開発マシンが死んだ!?
 vs Lesserkai 1.3.2 10番勝負
 TJshogi にも初勝利
 Lesserkai 1.3.2 (1秒)に初勝利!
 将棋大会 地区予選
 プレイアウト結果の信頼性
 vs ランダム将棋
 moca将棋
 ViVi 2.05

新着コメント

 無題/ひらた
 直った/びびすけ
 vs Laramie V2/びびすけ
 vs LaramieV1 10…/びびすけ
 vs TJshogi 0.03…/びびすけ
 vs ランダム将…/びびすけ
 vs TJshogi 0.03/びびすけ
 羽生×山崎/びびすけ
 ボナ×渡辺竜王/びびすけ
 羽生×山崎 戦/びびすけ

トラックバック

トラックバックはありません。

カテゴリ一覧

 基本データ
 テニス
 ジョギング
 ViVi
 自転車
 Web
 RunRunDietOnline
 PostgreSQL
 ビルドアップ走
 ランニング

2件の日記があります。

循環参照によるメモリリーク (2008/06/20 15:44) 0 comment

ViViScript はリファレンスカウントでオブジェクトを管理しているので、GC(garbage collection)とは無縁だと思っていたのだが、
オブジェクトが循環参照しているとオブジェクトが開放されずメモリリークが発生する、ということを最近知った。orz
同じ問題は Perl や PHP 5.2 でも発生するそう なのだが、オブジェクトが循環参照することは稀だし、
スクリプトの実行が終了すれば全メモリが開放されるので、あまり問題にならないのだが、
やっぱり気持ち悪いので、対処に挑戦してみることにする。

というわけで、まずはメモリリークが発生することを確認するプログラム:
http://vivi.dyndns.org/tech/src/rcObject-001.h.txt
http://vivi.dyndns.org/tech/src/rcObject-001.cpp.txt

CRCObjectPtr インスタンスを生成すると、リファレンスカウントにより管理される CRCObjectBody が生成される。
代入が可能で、参照数がゼロになると CRCObjectBody オブジェクトがデリートされる。

使用例:
    cout << "\n複数オブジェクト生成、代入:\n";
    {
        cout << "obj1 生成 ";
        CRCObject obj1;
        cout << "obj2 生成 ";
        CRCObject obj2;
        cout << "代入 obj1 = obj2 ";
        obj1 = obj2;
        cout << "代入終わり.\n";
    }

実行結果:
複数オブジェクト生成、代入:
obj1 生成 alloced 4331952
obj2 生成 alloced 4331664
代入 obj1 = obj2 freed 4331952
代入終わり.
freed 4331664

=====
期待通りに動作していることが確認できる
(2) に続く

循環参照によるメモリリーク (2) (2008/06/20 16:01) 0 comment

次に循環参照を作ってメモリリークが発生することを確認してみる

[1] 自分自身で循環参照している場合:
    cout << "\n子オブジェクト設定(循環参照):\n";
    {
        cout << "obj1 生成 ";
        CRCObject obj1;
        cout << "obj1 を obj1 の子供に設定 ";
        obj1.setChild1(obj1);
        cout << "設定終わり\n";
    }

実行結果:
子オブジェクト設定(循環参照):
obj1 生成 alloced 4331952
obj1 を obj1 の子供に設定 設定終わり

[2] 2つのオブジェクトが循環参照している場合:
    cout << "\n子オブジェクト設定(循環参照2):\n";
    {
        cout << "obj1 生成 ";
        CRCObject obj1;
        cout << "obj2 生成 ";
        CRCObject obj2;
        cout << "obj2 を obj1 の子供に設定 ";
        obj1.setChild1(obj2);
        cout << "設定終わり\n";
        cout << "obj1 を obj2 の子供に設定 ";
        obj2.setChild1(obj1);
        cout << "設定終わり\n";
    }

実行結果:
子オブジェクト設定(循環参照2):
obj1 生成 alloced 4331616
obj2 生成 alloced 4331328
obj2 を obj1 の子供に設定 設定終わり
obj1 を obj2 の子供に設定 設定終わり

=====
上記のように、循環参照していると確かにオブジェクト本体のメモリが開放されないことが確認できた。


2件の日記があります。

パスワード忘れ
今週のランキング
計算タマちゃん
FAQ
ヘルプ
about rrdOnline