shared_arrayクラステンプレートは動的に割り当てられた配列へのポインタを保持する。 (動的に割り当てられた配列とは、C++のnew[]によって割り当てられたものである。) shared_arrayに指されたオブジェクトは、そのオブジェクトを指す最後のshared_arrayが破棄もしくはリセットされるときに削除されることが保証される。
全てのshared_arrayはC++標準ライブラリのCopyConstructible(コピーコンストラクト可能)とAssignable(代入可能)の条件を満たすので、標準ライブラリのコンテナで使うことができる。 また、標準ライブラリの連想コンテナで使うことができるように、比較演算子が提供されている。
通常、shared_arrayはnewにより割り当てられたオブジェクトへのポインタを正しく扱うことはできない。 newによって割り当てられたオブジェクトの扱い方については、shared_ptrを参照のこと。
shared_arrayの実装には参照カウントが用いられているため、循環参照されたshared_arrayのインスタンスは正常に解放されない。 例えば、main()がAを指すshared_arrayを保持しているときに、そのAが直接的または間接的にA自身を指すshared_arrayを持っていると、Aに対する参照カウントは2となる。 最初のshared_arrayが破棄される際に、Aの参照カウントは1となり、そのインスタンスは破棄されずに残ってしまう。
shared_arrayに代わるものとして、std::vectorを指すshared_ptrがある。 これはshared_arrayに比べ若干重いが、より柔軟である。
このクラステンプレートには、指し示す配列の要素の型を表すパラメータTを与える。 Tはスマートポインタの共通の要求事項を満たさなければならない。
Synopsis
namespace boost {
template<typename T> class shared_array {
public:
typedef T element_type;
explicit shared_array(T * p = 0);
template<typename D>
shared_array(T * p, D d);
~shared_array(); // never throws
shared_array(shared_array const & r); // never throws
shared_array & operator=(shared_array const & r); // never throws
void reset(T * p = 0);
template<typename D>
void reset(T * p, D d);
T & operator[](std::ptrdiff_t i) const() const; // never throws
T * get() const; // never throws
bool unique() const; // never throws
long use_count() const; // never throws
void swap(shared_array<T> & b); // never throws
};
template<typename T>
bool operator==(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<typename T>
bool operator!=(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<typename T>
bool operator<(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<typename T>
void swap(shared_array<T> & a, shared_array<T> & b); // never throws
}
Members
element_type
typedef T element_type;
テンプレートパラメータ T の型を規定する。
constructors
explicit shared_array(T * p = 0);
shared_arrayを構築し、pのコピーを保持する。 pはC++のnew[]によって割り当てられた配列へのポインタか、0でなくてはならない。 その後、use countは1になる。 (p == 0の場合でも同様である。 ~shared_arrayを参照のこと) このコンストラクタが送出する可能性のある例外はstd::bad_allocだけである。 もし例外が発生すると、delete[] pが呼び出される。
template<typename D>
shared_array(T * p, D d);
shared_arrayを構築し、pのコピーとdのコピーを保持する。 その後、use countは 1 になる。 Dのコピーコンストラクタとデストラクタは例外を送出してはならない。 pに指されている配列が削除される時になると、 dオブジェクトがd(p)の形で実行される。 pを引数に取るdの実行において、例外を送出してはならない。 このコンストラクタが送出する可能性のある例外はstd::bad_allocだけである。 もし例外が発生すると、d(p)が呼び出される。
shared_array(shared_array const & r); // never throws
shared_arrayを構築し、rが保持するポインタのコピーを保持したかのように作用する。 その後、全てのコピーのuse countは1増加する。
destructor
~shared_array(); // never throws
use countを1減少させる。 そしてもしuse countが0だった時、保持しているポインタが指す配列を削除する。 値が0のポインタに対するdelete[]が安全であることに注意。 Tは完全型である必要はない。 削除される配列の要素のデストラクタが例外を送出しないという条件が満たされている場合、このデストラクタが例外を送出しないことが保証される。 スマートポインタの共通の要求事項を参照のこと。
assignment
shared_array & operator=(shared_array const & r); // never throws
上で説明されているように新しいshared_arrayが構築され、現在のshared_arrayと新しいshared_arrayが交換される。 交換された元のオブジェクトは破棄される。
reset
void reset(T * p = 0);
上で説明されているように新しいshared_arrayが構築され、現在のshared_arrayと新しいshared_arrayが交換される。 交換された元のオブジェクトは破棄される。 送出する可能性のある例外はstd::bad_allocだけである。 もし例外が発生すると、delete[] pが呼び出される。
template<typename D>
void reset(T * p, D d);
上で説明されているように新しいshared_arrayが構築され、現在のshared_arrayと新しいshared_arrayが交換される。 交換された元のオブジェクトは破棄される。 Dのコピーは例外を送出してはならない。 送出する可能性のある例外はstd::bad_allocだけである。 もし例外が発生すると、d(p)が呼び出される。
indexing
T & operator[](std::ptrdiff_t i) const; // never throws
保持しているポインタが指す配列のi番目の要素への参照を返す。 保持しているポインタが0のとき、及びiが0未満または配列の要素数以上の数であるとき、この演算子のふるまいは未定であり、ほぼ確実に有害である。
get
T * get() const; // never throws
保持しているポインタを返す。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。
unique
bool unique() const; // never throws
保持しているポインタが他のshared_arrayに共有されていないときtrueを返す。 そうでなければfalseを返す。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。
use_count
long use_count() const; // never throws
保持しているポインタを共有するshared_arrayオブジェクトの数を返す。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。
use_countは、明示的に参照カウントを使わないようにするためのshared_arrayの実装に必要とされて用意されているものではないため、将来のバージョンでは削除される可能性がある。 従って、use_countはデバッグや試験の為にだけ使用するべきで、製品のコードに使用するべきでない。
swap
void swap(shared_ptr & b); // never throws
二つのスマートポインタの中身を交換する。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。
Free Functions
comparison
template<ypename T>
bool operator==(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<ypename T>
bool operator!=(shared_array<T> const & a, shared_array<T> const & b); // never throws
template<ypename T>
bool operator<(shared_array<T> const & a, shared_array<T> const & b); // never throws
二つのスマートポインタが保持するポインタを比較する。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。
operator<オーバーロードは、shared_ptrオブジェクトの順序付けを定義し、std::mapなどの連想コンテナで使えるようにするために提供される。 std::mapの実装では、比較を行うためにstd::less<T*>を用いる。 これにより、比較が正しく扱われることを確実にする。 C++標準によると、ポインタに対する関係演算の結果は不定であるが(5.9 [expr.rel] paragraph 2)、ポインタに対するstd::less<>の結果は明確に定義されている。 (20.3.3 [lib.comparisons] paragraph 8).
swap
template<typename T>
void swap(shared_array<T> & a, shared_array<T> & b) // never throws
a.swap(b)と等価。 std::swapのインターフェースとの一貫性を図り、ジェネリックプログラミングを補助するために用意されている。
Revised 8 February 2002
Copyright 1999 Greg Colvin and Beman Dawes. 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, オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。 このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。 また、いかなる目的に対しても、その利用が適していることを関知しない。