(私が C++ プログラマだということに一応の合意をしていただけると仮定した上で) ある C++ プログラマから見た Garbage Collection の理解

少なくとも自分は, C++ でプログラムを組むなら,生成したオブジェクトは必ず責任を持って破壊することを徹底しているし,確保したヒープは責任を持って OS さんにお返しすることを徹底している.これは C++ の基本中の基本だというのが自分の考え.だから C++ においては「他のオブジェクトから参照されなくなった不要なオブジェクト (ゴミ,garbage) を回収 (collection) する機構」は要らないというのが個人的な立場.
しかしながら,「だから C++ において GC は不要」とはならない.これが今現在の自分の考え.
C++ には,他のオブジェクトを参照するという概念を言語の機能として提供していて,それは型・構文に明示的に現れる.ポインタ型・参照型がそれ.
注意するべきは, C++ においては「あるオブジェクトを参照している」という概念と「あるオブジェクトの生存を維持している (所有している)」という概念が完全に独立・直交したものである点.ポインタ・参照が指す先に有効なオブジェクトが存在しているかどうかは,言語がまったく関知しない事項であり,完全にプログラマの責任において管理されるべき事柄である.
あるオブジェクトが他のオブジェクトを参照するというパタンは極めて多用される.上に述べたとおり, C++ においてはこの「参照する」という言葉が被参照オブジェクトの生存を含意しない.したがって,一般に参照しているオブジェクトと参照されているオブジェクトの生存期間は非同期となる.すなわち,参照しているオブジェクトが参照されているオブジェクトより先に死ぬかも知れないし,参照されているオブジェクトが参照しているオブジェクトより先に死ぬかもしれない.前者が問題となることはまず無いと考えられるが,後者は参照が無効となったことをプログラマの責任において管理しないといけない.オブジェクト間の関係が複雑になればなるほど,この責任と管理コストは組み合わせ的に増大し,プログラマの責任 (人手) で統括することは困難になる.
こういう視点から見ると, GC というモノはむしろその名前に反して「他のオブジェクトから参照されている必要なオブジェクトの生存を保証する機構」という側面から理解した方が, (特に C++ 的な視点から見れば) その利点を納得しやすいように感じられる.
ダメカナ?