Smart
Pointer Changes
2002 年 2 月の Boost スマートポインタの改訂では、
多くの変更が導入された。
長期に渡り以前のバージョンのスマートポインタが使用されてきたため、
ライブラリのユーザの視点における詳細な変更履歴を設けることは有益である。
メンバーテンプレートの対応が不十分なコンパイラでは、
多くの新機能が割愛される古いバージョンとほとんど変わらない実装が使用される。
Features Requiring Code Changes to Take Advantage
-
このスマートポインタクラステンプレートは、現在ではそれぞれ別のヘッダファイルに分けられている。
互換性のために、
<boost/smart_ptr.hpp>
ヘッダファイルは 4 つの旧型のスマートポインタクラステンプレートのヘッダファイルをインクルードするようになった。
- weak_ptr テンプレートが追加された。
-
新しい shared_ptr と shared_array は、
それらのスマートポインタに保持されるオブジェクトのデストラクタが
shared_ptr のデストラクタを実体化する際に可視でなくてはならない
という制約を緩和した。
これにより、明示的なデストラクタ無しに shared_ptr のメンバを持つことが容易になった。
-
shared_ptr または shared_array を作成する際に、
ユーザ定義のデアロケータを渡すことができるようになった。
-
shared_ptr 及び weak_ptr に於いて、
ポインタに対する static_cast や dynamic_cast と同様に働く
shared_static_cast 及び shared_dynamic_cast 関数テンプレートが提供された。
-
shared_ptr::reset の不要な自己代入機能を取り除いた。
しかし、scoped_ptr と std::auto_ptr では依然その機能が提供されている。
shared_ptr に既に所有されているポインタを伴う reset 呼び出しでは、
その結果は未定義のふるまいとなる
(アサートが有効であればアサートされ、
無効であればポインタに指されるオブジェクトが二重に delete されることになる)
-
BOOST_SMART_PTR_CONVERSION 機能が取り除かれた。
- shared_ptr<void> の定義が許された。
Features That Improve Robustness
-
参照カウントの操作が Windows、Linux、その他の pthreads をサポートするプラットフォームにて
スレッド安全(thread safe) になった。
詳細については
<boost/detail/atomic_count.hpp>
を参照のこと。
-
新しい shared_ptr は、最初に構築された時に与えられた型で保持するポインタを
delete するようになった。
これにより、最後の shared_ptr が仮想デストラクタを持たないクラスの派生クラスのインスタンスを指していたときに
起こりうる、発見しにくい問題を予防することができる。
Implementation Details
-
代入演算子と reset に関する幾つかのバグが "コピー交換(copy and swap)"
イディオムを用いて修正された。
-
幾つかの関数の事前条件を紹介するために assertion が追加された。
しかし、これらは新しい
<boost/assert.hpp>
ヘッダを利用しており、
デフォルトでは assertion は無効になっている。
-
operator< の代わりに std::less の部分特殊化版が置きかえられ、
不定のふるまいに頼らずに同様の処理ができるようになった。
-
std::swap の不正なオーバーロードは
boost::swap に置きかえられた。
boost::swap は C++ 標準を侵略することなく、
同様のジェネリックプログラミングへの様々な利点を持つ。
Revised 1 February 2002
Copyright 2002 Darin Adler.
Permission to copy, use,
modify, sell and distribute this document is granted provided this copyright
notice appears in all copies. This document is provided "as is"
without express or implied warranty, and with no claim as to its suitability for
any purpose.
Japanese Translation Copyright (C) 2003
Ryo Kobayashi.
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の
複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」
に提供されており、いかなる明示的、暗黙的保証も行わない。また、
いかなる目的に対しても、その利用が適していることを関知しない。