オブジェクト所有者の概念とポインタの寿命

通常のスマートポインタは、参照回数に基づくもので、参照がなくなったら勝手にメモリ領域が回収されるというものだ。これは、使う側にとっては非常に楽だ。しかし、僕は、このようなスマートポインタは、新しい苦痛を生み出す原因になるかもしれないと思っている。

Cのプログラミングを考える。Cでは、ヒープ領域の確保とその回収を必ず対応付けることが基本だ。例えば、関数呼び出しを行う場合は、関数呼び出し側が領域を確保し、関数を呼び出したあと、その領域を回収するのが基本的な流れになる。たまにこれに反する流れを要求するライブラリ(関数実行によって新たなメモリ領域が作られるので、呼び出し側がそれを回収しなければいけない)があるが、こういうライブラリは使い方を間違いやすい(多くのプログラマから、反発の目でみられることになる)。

参照回数スマートポインタやガベージコレクションのように、メモリの解放の責任がプログラマの手を離れるというのは、ぱっと見動くコードは書きやすいのだが、何が起こっているか自分でも分からないコードが作れてしまうという怖いところもある。(つーかさ、ソフトウェア完成間近になってから、「タイミングの問題で、終了処理がきれいにできませ〜ん」ってのは、まともなソフトウェアとしてあり得ないでしょ。)

ガベージコレクションによって、dangling pointerの問題(死んでしまったポインタを参照する)がなくなるのは確かだ。しかし、dangling pointerは、設計のバグだ。すなわち、設計時に、オブジェクトの所有者やポインタの寿命について良く考えずに、そして、間違った認識の下で設計されているということだ。これをコーディングによってかわしても、一時凌ぎにしかすぎないように思う。

9/2の日記の中で書いたように、スタック上のオブジェクトは、スコープから外れたら勝手に回収されるという点で、直感的にも分かりやすく、非常に使いやすい。僕は、すべてのオブジェクトが、このような直感的な意味をもつのが理想だと思う。というわけで、参照回数に基づくスマートポインタではなく、スコープを持ち、そのスコープ内でのみ使用できるというような意味をもつスマートポインタがあれば良いと思う。

ちなみに、参照回数に基づくもの以外のスマートポインタとして、C++標準のautoポインタがある。しかし、これは少し奇妙な振る舞いをするので使いにくい。const autoポインタは良い線をいっているのだが、コピーができないので、他のクラスに渡したりができない。コピーができるconst autoポインタというのを定義すれば、それが僕の理想に一番近いかもしれない。