nine は、SharedPtr< T > というテンプレートクラスを提供している。 これは、いわゆる参照カウント式のスマートポインタである。
通常のポインタと同様に扱え、全ての参照が無くなった時にポインタの解放が行われる。
SharedPtr に与えるクラスは Sharable を継承しなければならない。
class Sharable
{
protected:
inline virtual ~Sharable() { }
virtual void finalize() = 0;
解放時に finalize() 関数が呼ばれ、その後に delete される。 ユーザーは finalize() かデストラクタに後始末処理を記述することができる。
class Foo: public Sharable {
public:
inline virtual void finalize() { printf("fin\n"); } //破壊時に呼ばれる
inline void dump() { printf("foo\n"); }
};
typedef SharedPtr< Foo > FooPtr;
上のコードのように、typedef しておくと便利。FooPtr pf;ヒープに確保することもできるが、それでは SharedPtr を使う利点が無い。
FooPtr pf(new Foo()); pf = new Foo();
pf->dump();記述法は通常のポインタと同じになっている。
FooPtr pf2; pf2 = pf;
if (pf == pf2) { ; } // true
if (pf == NULL) { ; }
特に、デフォルトコンストラクタで生成した直後は NULL との比較は真である。
void foo() {
FooPtr pf,pf2;
pf = new Foo();
pf2 = pf;
pf = NULL;
}
関数から出る時にスタック上にある pf,pf2 は解放される。
両方が消える時に、new Foo() でヒープ上に生成した Foo インスタンスの解放も行われる。