ポインタについて考える
(1)
- ガーベージコレクションは、結局のところfree(もしくはdelete)を自動化するためのものであって、それ以上を期待するべきではない。
(2)
- メモリマネージャによる、自動deleteができたとして、残された問題は次の通り:
- [1]もうfreeしてしまっているのに使おうとしていることを検出できるか?(低速モードだけでもいいから)
- [2]freeし忘れを検出できるか?
- [1]については、任意のポインタを渡されたとき、それが今でも有効かどうかを判定できれば良い。
- もしポインタがリサイクルされるかもしれないことを考えると、リビジョンがなければいけない。
- しかしリビジョンがつくとポインタが大きくなってしまう。ポインタの中に押し込むと、表現可能な範囲が減る。
- リビジョンなしで近いことを実現するなら、ポインタの再利用をやめる、これしかない。
- クラスや名前空間ごとに、ポインタの再利用をやめさせることができるようにする。
- これのためには子供のライブラリも影響するのではないか。
- 指定された親からのリクエストであれば、子供も同じように影響されるべき。
- となれば、オブジェクトごとというか、利用ハンドルごとで、フラグを管理するべきだな。
- [2]はあまり難しくない。リークしたもののリストがあればいいだけだから。newのときのコールスタックがあるといいのかな。
(3)
- 未初期化と初期化済みの2状態があるのはどうか?(C++などの強制コンストラクタは、未初期化状態がない世界を目指している)
- つまり初期化済みのリストがあればいい。初期化したものは未初期化に戻さなければいけない。
- malloc/free と init/deinit を一緒にしないのはかなりいいアイデアかもしれない。