確保したリソースの解放を人任せにしない

C++言語ならnewで確保したオブジェクトはdeleteで解放する。WindowsならGlobalAlloc()で確保したグローバルメモリはGlobalFree()で解放する。C言語ならmalloc()で確保したヒープメモリはfree()で解放する。
確保された剥き出しのポインタやグローバルハンドルは、手作業で解放をしなければならない。リソースの使用後に、解放函数を呼び出す必要があったりする。すべて自分で書いたコードなら問題は発生しないかもしれない。でも、そのコードが未来永劫自分の管理下にある保証は? 解放函数を呼び出す手順は、仕様として定められているだけで、次の担当者はその仕様書を読まないかもしれない。そもそも、詳細仕様なんて書きますか? あんなもの読みますか? コード読んだ方が確実じゃないですか? そのコードに、有象無象の約束事があったら、大変じゃないですか? コメントが常に信用できますか?
オブジェクト指向プログラミングが可能な言語では、確保と解放をコードで管理できる。そのようなコードを書こう。


確保したリソース受け取ってラップするクラスを使おう。
そのクラスのデストラクタで、リソースを解放しよう。
ポインタやハンドルを取得するメソッドを作ろう。リソースは、そのメソッド経由で参照しよう。


ソースを管理するクラスは、すでに出来のいいものが存在しているが、できあいのクラスで管理できないリソースは、自分で管理するクラスを作ろう。
スコープを外れたら不要になるリソースの管理クラスなら、かんたんに作れるだろう。デストラクタに解放函数を書いておけばいいだけだ。
あちこちで共用したいリソースの管理クラスなら、参照カウンタが必要になる。参照カウンタというのは、管理クラスがコピーされた回数──同一のリソースを参照している管理クラスオブジェクトの数──を示すもの。これを、メンバ変数としてヒープなどに持っておき、コピーの際にインクリメントしてカウンタのポインタを渡す。デストラクト時にカウンタをデクリメントする。カウンタ値がゼロになった時点でリソースを削除する。


newで確保したリソースなら、Boost C++ Librariesのshared_ptrやscoped_ptrが使いやすい。デストラクタでdeleteを実行してくれる、スマートポインタ。
shared_ptrは、参照カウンタを持っているので、名前の通りオブジェクトをいくらでもコピーして使える。スコープを外れるなどして、コピーがゼロになった時点でリソースが削除される。
scoped_ptrは、スコープを外れた時点でリソースを削除する。
Standard Template Library(STL)のauto_ptrもスマートポインタだが、これはオブジェクトをコピーするとリソースの「所有権」をコピー先に渡す。この所有権を持つオブジェクトがデストラクトされるときに、リソースが削除される。例えば、函数の引数にオブジェクトを渡すとコピーが発生するので、その函数を抜けるときにリソースが削除される。コピーは避け、参照(リファレンス)で渡すようにしたい。クセがあるので、できれば避けたいが、外部ライブラリの使用が認められないのなら、やむを得ない。
やむを得ないが、Boostを使うと開発効率が大きく改善されるので、開発環境や動作環境が許すなら、導入に努力する価値はある。