最終更新日時:
が更新

履歴 編集

scoped_array class template

scoped_arrayクラステンプレートは動的に割り当てられた配列へのポインタを保持する。 (動的に割り当てられた配列とは、C++のnew[]によって割り当てられたものである。) scoped_arrayに指された配列は、そのscoped_arrayが破棄されたとき、もしくは明示的にresetを呼び出したときに削除されることが保証される。

scoped_arrayテンプレートはシンプルな要求におけるシンプルな解決法である。 これは、所有権の共有や移動を伴わずに、デザインパターンの"Resource Acquisition Is Initialization"イディオム(訳注:RAIIパターン、「資源獲得を初期化時に行う」ことによりオブジェクトの所有権の所在を明確にする) を実現するための基礎的な仕組みを提供する。 scoped_arrayの名前と意味的な主張(noncopyableであるということ)の両方が、そのスコープでの所有権の所在が唯一であることを表す。 これはnoncopyableであり、コピーされるべきでないポインタに対して、shared_arrayよりも安全である。

scoped_arrayはとてもシンプルなので、通常の実装では全ての操作は組み込み配列ポインタと同様に速く、組み込み配列ポインタよりも大きな記憶スペースを取ることはない。

scoped_arrayはC++標準ライブラリコンテナの中で使うことはできない。 配列のスマートポインタをコンテナの中に格納する必要があるときは、shared_arrayを使う。

scoped_arrayは単独のオブジェクトへのポインタを正しく扱うことはできない。 単独のオブジェクトへのポインタを扱うためにはscoped_ptrを参考にせよ。

scoped_arrayに代わるものとして、std::vectorがある。 std::vectorscoped_arrayに比べ若干重いが、より柔軟である。 動的なメモリ割当を使わないのであれば、boost::arrayもまた、scoped_arrayの代わりとなる。

このクラステンプレートには、指し示す配列の要素の型を表すパラメータTを与える。 Tはスマートポインタの共通の要求事項を満たさなければならない。

Synopsis

namespace boost {

template<typename T> class scoped_array : noncopyable
{

public:
    typedef T element_type;

    explicit scoped_array(T * p = 0); // never throws
    ~scoped_array(); // never throws

    void reset(T * p = 0); // never throws

    T & operator[](std::ptrdiff_t i) const; // never throws
    T * get() const; // never throws

    void swap(scoped_array & b); // never throws
};

template<typename T>
void swap(scoped_array<T> & a, scoped_array<T> & b); // never throws

}

Members

element_type

typedef T element_type;

保持されるポインタの型を規定する。

constructors

explicit scoped_array(T * p = 0); // never throws

scoped_arrayを構築し、pのコピーを保持する。 pはC++のnew[]によって割り当てられた配列へのポインタか、0でなくてはならない。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。

destructor

~scoped_array(); // never throws

保持されているポインタが指す配列を削除する。 値が0のポインタに対する delete[]が安全であることに注意せよ。 Tは完全型である必要はない。 削除される配列の要素のデストラクタが例外を送出しないという条件が満たされている場合、このデストラクタが例外を送出しないことが保証される。 スマートポインタの共通の要求事項を参照のこと。

reset

void reset(T * p = 0); // never throws

pが保持するポインタと等価でなければ、保持するポインタが指す配列を削除し、pのコピーを保持する。 pはC++のnew[]によって割り当てられたものか、0でなければならない。 削除される配列の要素のデストラクタが例外を送出しないという条件が満たされている場合、このデストラクタが例外を送出しないことが保証される。 スマートポインタの共通の要求事項を参照のこと。

subscripting

T & operator[](std::ptrdiff_t i) const; // never throws

保持しているポインタが指す配列のi番目の要素への参照を返す。 保持しているポインタが0のとき、及びiが0未満または配列の要素数以上の数であるとき、この演算子のふるまいは未定であり、ほぼ確実に有害である。

get

T * get() const; // never throws

保持しているポインタを返す。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。

swap

void swap(scoped_array & b); // never throws

二つのスマートポインタの中身を交換する。 Tは完全型である必要はない。 スマートポインタの共通の要求事項を参照のこと。

Free Functions

swap

template<typename T>
void swap(scoped_array<T> & a, scoped_array<T> & b); // never throws

a.swapと等価。 std::swapのインターフェースとの一貫性を図り、ジェネリックプログラミングを補助するために用意されている。


Revised 1 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, オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。 このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。 また、いかなる目的に対しても、その利用が適していることを関知しない。