渋川です。
僕の前のメールはなんか日本語のろれつが回ってない感じですね。紹興酒のせい
でした。
> C++の言語仕様によると,あるメモリ領域がどの型なのか知る手段がありませ
> ん.また,一般的なC++コンパイラは,型情報を記録することをしていません.
> したがって,実際には int の 100 が入っている領域も,100番地というポイ
> ンタが入っているのかもしれないと「保守的に」扱う必要があります.
Cでも型情報を持っていて色々やるコードというのはあります。SWIGなんかもそ
うです。SWIGの場合はスクリプト言語とC/C++コードのコミュニケーションのた
めに持っているのであってGCのためではないですけど。あとはスマートポインタ
の類も型情報を持っているからこそ参照カウントで消せるといえると思います。
僕とεπιさんが紹介したBoehm GCは保守的GCだけではなく、ポインタ情報も使
用しているようです。new/mallocなんかをオーバーライドするには少なくとも
「確実にポインタであるもののデータベースを作る」という意図があるからです。
自動でやってくれないのは重々承知しております。Python便利ですもん。
ところでRubyってexact GCでしたっけ?僕の記憶では違った気がします。マーク
&スイープの保守的なGCだったと思います。
> > そのルートのオブジェクトの参照を断つというのと、C++のオブジェクトを
> > deleteするように気をつける、というのは同義だと思います。
>
> 同義ではありません.C++ の delete はそのオブジェクトへの参照が完全に存
> 在しなくなる場合だけ行う必要があります.一方,オブジェクトの参照を断つ
> というのは,メソッド等の中でそのオブジェクト利用することがなくなった場
> 合に行います.これは,よそで使われているかどうかは関係なく行えます.
shared_ptrでは他に参照しているポインタが存在したらdeleteを遅延してくれま
すので単純にそうでもないと思います。僕が同義だと言ったのは、もう使わない、
gomiという名前の変数に格納されたオブジェクトがあったとして、
gomi = NULL;
と書くのも、
delete gomi;
と書くのも、表現が異なるだけで、やりたいこともやる手間も変わらないんじゃ
ないか、と思ったからです。C++だとgomiに入っているオブジェクトが参照して
いる他のオブジェクトも道連れにするにはそういうコーディングをする必要はあ
りますけどね。それもほとんどの場合は
Nakama* 道連れ;
というのを
shared_ptr<Nakama> 道連れ;
と書き換えればおしまいだと思います。
# 参照を断つ、というのは前者の表現のことですよね?
----
東京工業大学 国際開発工学専攻 上田研
_/_/_/ しぶかわよしき JA6HFA/1 yoshiki@....jp
_/ http://www.shibu.jp http://www.unittest.org