渋川です。
> C++で保守的GCが使われるのは,言語の制約で,こういうのくらいしか
> 使えるGCがないためです.
言語の制約ではないと思いますよ。RubyだってPythonだってJavaVMだってCで記
述されているんですから。C++のコンパイラですらCで記述されています。
# CでCのコンパイラを記述するというのが芸術的とか言っている人もいますけど。
> >そゆのもあったですね。JavaはGC持ってるからメモリ・リークがない、
> >なんて考えてたら大間違いで、誰かが捕まえて離さないとぢわぢわメモリ
> >を食い潰し…てな事態は決してレア・ケースじゃない。
> それは「メモリリーク」とは言わんでしょ.
メモリ食いつぶしという結果に対してその対処法としてGCではすべてまかない切
れない、という話だと思います。メモリ食いつぶしを便宜上メモリ・リークと呼
んでいるんだと思います。プログラマのミスでメモリが食いつぶされるのを呼ぶ
のってメモリ・リーク以外あるんでしょうか?そのプログラマからすれば駄々漏
れなのでメモリ・リークでもいいと思います。
> メモリリークってのは,たとえば全オブジェクトが既に到達不能になっている
> にも関わらず,プログラマーがdelete()を忘れたために永久にメモリを消費し
> 続ける現象です.到達可能な「現在活動中」のオブジェクトの領域が解放でき
> ないのは,言語に関係なく当然のことです.
fj.comp.lang.cのスレッドの全部は読んでいないため一言で結論は出せませんの
で、メモリリークの定義については決まった解を持っていないのでうかつには僕
は言いませんが、誰かが参照を持っている=仕事をしている、というのではない
のは確かだと思います。仕事してなくても参照を持たれていてはだめだよね、そ
ういうプログラミングをしていてはGCも活躍はできないよね、というのがεπι
さんの言いたいことだと思います。
# プロセスが終わるときにヒープメモリを全部解放してくれる保証があるOSなら
# mallocしたメモリをfreeする必要はない、という議論です < fj.comp.lang.c
> >C++はGCの持ち合わせ
> >はないけれど、new/deleteを差し替えられるから取得/解放のログみたいなの
> >を取るとか、取得失敗にみせかけることだってできる…とかなんとか
> C++だってnewばかりしてdelete()せず,全部の参照(ポインタ)を保持
> してたら,メモリをじわじわと食い潰して当然ですね.C++では全部の
> 参照を上書きしてさえも,じわじわとメモリを食い潰すのが問題なんです.
C++の言語仕様上、参照の上書きというのはメモリ解放の手段にはなりえないの
ですが・・・メモリがきちんと解放されているかを調べたり、取得失敗時の挙動
が適切かを調べるという話であって、自動的にどうのこうのという例の話をして
はいないと思います。
> なお,Javaの様にGCのある言語では,生きているオブジェクトが増えてじわ
> じわとメモリ消費が増えていっても,最悪それらのオブジェクトへの参照を
> 元から断てば,(上書きしたり,スコープから外れたりすれば)後はGCが勝手
> に回収してくれます.
そのルートのオブジェクトの参照を断つというのと、C++のオブジェクトを
deleteするように気をつける、というのは同義だと思います。
----
東京工業大学 国際開発工学専攻 上田研
_/_/_/ しぶかわよしき JA6HFA/1 yoshiki@....jp
_/ http://www.shibu.jp http://www.unittest.org