boost::check_delete(r) の話もそろそろ終わりとしたい。まずは、std::auto_ptr と boost::scoped_ptr のデストラクタを見てみよう(ただし簡略化した形で。実際の実装に関してはそれぞれのヘッダファイルを参照のこと)。

template <typename T>
class auto_ptr {
T* ptr_;
public:
//
// そのほかの宣言・定義は省略
//

~auto_ptr() {
delete ptr_;
}
};

template <typename T>
class scoped_ptr {
T* ptr_;
public:
//
// そのほかの宣言・定義は省略
//

~scoped_ptr() {
boost::checked_delete(ptr_);
}
};

問題はひとことで言い表すことができる。テンプレート引数として与えられたクラスが不完全な場合にも、std::auto_ptr のデストラクタはコンパイル可能なのである。これを改善するために、boost::checked_delete を用いる boost::scoped_ptr が用意された。boost::scoped_ptr を用いて Pimpl イディオムを実装すれば、前回の例で示したミスはコンパイル時に必ず検出される。

ここまで、くだくだしく書いてきたことは(それが設計意図であるのだから)もちろん boost のドキュメントに記述されている(オリジナル日本語翻訳)。

One common usage of scoped_ptr is to implement a handle/body (also called pimpl) idiom which avoids exposing the body (implementation) in the header file.

The scoped_ptr_example_test.cpp sample program includes a header file, scoped_ptr_example.hpp, which uses a scoped_ptr<> to an incomplete type to hide the implementation. The instantiation of member functions which require a complete type occurs in the scoped_ptr_example.cpp implementation file.