スマートポインタ

xtalとのやり取りに、ユーザーがC++で定義していたクラスを使うことは以前から可能ではあったのですが、xnew関数で生成したインスタンスじゃないと、SmartPtrで保持することはできませんでした。
この制限をもう少しゆるくすることにしました。

// 普通のnewで生成
A* p = new A();

// スマートポインタの第二引数に破壊関数オブジェクトを指定する。
// 用意されているdeleterを指定すると、指しているスマートポインタが無くなりgcが走る際にdeleteしてくれる
SmartPtr<A> sp(p, deleter);

// 長寿命のオブジェクトとして生成
static A static_a;

// 用意されているundeleterを指定すると何も行われない。
// オブジェクトの寿命より、指しているスマートポインタの方が長生きだとクラッシュしてしまう可能性がある
SmartPtr<A> sp2(&static_a, undeleter);

この指定する破壊関数オブジェクトはユーザーが作成したものを渡すこともできます。
つまり、WindowsのCOMも、Releaseを呼ぶ破壊関数オブジェクトを作れば、そのままSmartPtrが保持できるようになることになります。