山崎です.横槍失礼.
> > C++で保守的GCが使われるのは,言語の制約で,こういうのくらいしか
> > 使えるGCがないためです.
>
> 言語の制約ではないと思いますよ。RubyだってPythonだってJavaVMだってCで記
> 述されているんですから。C++のコンパイラですらCで記述されています。
村上さんが言われる通り,言語の制約です.
C++の言語仕様によると,あるメモリ領域がどの型なのか知る手段がありませ
ん.また,一般的なC++コンパイラは,型情報を記録することをしていません.
したがって,実際には int の 100 が入っている領域も,100番地というポイ
ンタが入っているのかもしれないと「保守的に」扱う必要があります.
Ruby, Python, Java の実装は,オブジェクトの構造体に型情報を記録してい
ます.したがって C で書かれているにもかかわらず,exact GC を使うことが
できます.
> > >そゆのもあったですね。JavaはGC持ってるからメモリ・リークがない、
> > >なんて考えてたら大間違いで、誰かが捕まえて離さないとぢわぢわメモリ
> > >を食い潰し…てな事態は決してレア・ケースじゃない。
> > それは「メモリリーク」とは言わんでしょ.
>
> メモリ食いつぶしという結果に対してその対処法としてGCではすべてまかない切
> れない、という話だと思います。メモリ食いつぶしを便宜上メモリ・リークと呼
> んでいるんだと思います。プログラマのミスでメモリが食いつぶされるのを呼ぶ
> のってメモリ・リーク以外あるんでしょうか?そのプログラマからすれば駄々漏
> れなのでメモリ・リークでもいいと思います。
>
> > メモリリークってのは,たとえば全オブジェクトが既に到達不能になっている
> > にも関わらず,プログラマーがdelete()を忘れたために永久にメモリを消費し
> > 続ける現象です.到達可能な「現在活動中」のオブジェクトの領域が解放でき
> > ないのは,言語に関係なく当然のことです.
>
> fj.comp.lang.cのスレッドの全部は読んでいないため一言で結論は出せませんの
> で、メモリリークの定義については決まった解を持っていないのでうかつには僕
> は言いませんが、誰かが参照を持っている=仕事をしている、というのではない
> のは確かだと思います。仕事してなくても参照を持たれていてはだめだよね、そ
> ういうプログラミングをしていてはGCも活躍はできないよね、というのがεπι
> さんの言いたいことだと思います。
到達可能だけど実際使われていない領域を解放できないのは現在のGCの原理的
限界なのは確かです.この問題は,いずれは解決しなくてはならない問題だと
思います.
> > なお,Javaの様にGCのある言語では,生きているオブジェクトが増えてじわ
> > じわとメモリ消費が増えていっても,最悪それらのオブジェクトへの参照を
> > 元から断てば,(上書きしたり,スコープから外れたりすれば)後はGCが勝手
> > に回収してくれます.
>
> そのルートのオブジェクトの参照を断つというのと、C++のオブジェクトを
> deleteするように気をつける、というのは同義だと思います。
同義ではありません.C++ の delete はそのオブジェクトへの参照が完全に存
在しなくなる場合だけ行う必要があります.一方,オブジェクトの参照を断つ
というのは,メソッド等の中でそのオブジェクト利用することがなくなった場
合に行います.これは,よそで使われているかどうかは関係なく行えます.
山崎 進 --- yamazaki@....jp
福岡県産業・科学技術振興財団
福岡知的クラスター研究所