最終更新日時:
が更新

履歴 編集

shared_array class template

shared_arrayクラステンプレートは動的に割り当てられた配列へのポインタを保持する。 (動的に割り当てられた配列とは、C++のnew[]によって割り当てられたものである。) shared_arrayに指されたオブジェクトは、そのオブジェクトを指す最後のshared_arrayが破棄もしくはリセットされるときに削除されることが保証される。

全てのshared_arrayはC++標準ライブラリのCopyConstructible(コピーコンストラクト可能)とAssignable(代入可能)の条件を満たすので、標準ライブラリのコンテナで使うことができる。 また、標準ライブラリの連想コンテナで使うことができるように、比較演算子が提供されている。

通常、shared_arraynewにより割り当てられたオブジェクトへのポインタを正しく扱うことはできない。 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, オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。 このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。 また、いかなる目的に対しても、その利用が適していることを関知しない。