scoped_ptrソース

6037 ワード

/* E:\Program Files\CodeGear\RAD Studio\7.0\include\boost_1_35\boost/checked_delete.hpp 24: */
namespace boost
{
    template inline void checked_delete(T * x)
    {
        typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
        (void) sizeof(type_must_be_complete);
        delete x;
    }
    template inline void checked_array_delete(T * x)
    {
        typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
        (void) sizeof(type_must_be_complete);
        delete [] x;
    }
    template struct checked_deleter
    {
        typedef void result_type;
        typedef T * argument_type;
        void operator()(T * x) const
        {
            boost::checked_delete(x);
        }
    };
    template struct checked_array_deleter
    {
        typedef void result_type;
        typedef T * argument_type;
        void operator()(T * x) const
        {
            boost::checked_array_delete(x);
        }
    };
}
/* E:\Program Files\CodeGear\RAD Studio\7.0\include\boost_1_35\boost/scoped_ptr.hpp 23: */
namespace boost
{
    template class scoped_ptr
    {
    private:
        T * ptr;
        scoped_ptr(scoped_ptr const &);
        scoped_ptr & operator=(scoped_ptr const &);
        typedef scoped_ptr this_type;
    public:
        typedef T element_type;
        explicit scoped_ptr(T * p = 0): ptr(p)
        {
        }
/*コンストラクタ、ストレージ
pのコピーです.注意、
pは必ず
operator newで割り当てられた、またはnullです.構造の時、
要求しない
Tは完全なタイプでなければならない.ポインタ
pは、直接呼び出すのではなくallocation関数を呼び出す結果です.
newが得た場合
このタイプは完全ではなく、タイプだけが必要だからです.
Tの前置き声明でいいです.このコンストラクション関数は放出されません
異常です.*/
        explicit scoped_ptr(std::auto_ptr p): ptr(p.release())
        {
        }
/*1つのauto_からptrは制御権を受け取りauto_を指すptrポインタが指すオブジェクト、auto_prtポインタがオブジェクトを指さなくなりました*/
        ~scoped_ptr()
        {
            boost::checked_delete(ptr);
        }
/*指定したオブジェクトを削除します.を選択します.
Tは破棄される際に完全なタイプでなければならない.場合
scoped_ptrは析出時に
資源を占有すると、何もしません.この解析関数は異常を放出しません.*/
        void reset(T * p = 0)
        {
            ((p == 0 || p != ptr) ? (void)0 : _assert( "p == 0 || p != ptr", "E:\\Program Files\\CodeGear\\RAD Studio\\7.0\\include\\boost_1_35\\boost/scoped_ptr.hpp", 82));
            this_type(p).swap(*this);
        }
/*1つリセット
scoped_ptrは保存したポインタを削除し、もしあれば再保存します.
p. 通常、資源の生存期間は
管理は完全に
scoped_ptrは自分で処理しますが、ごく少数の場合、資源は
scoped_ptrの析出前に放出するか、

scoped_ptrは、既存のリソース以外の別のリソースを処理します.この場合、
resetですが、できるだけ使わないでください.
(通常は設計上の問題を表します)この関数は異常を放出しません.*/
        T & operator*() const
        {
            ((ptr != 0) ? (void)0 : _assert( "ptr != 0", "E:\\Program Files\\CodeGear\\RAD Studio\\7.0\\include\\boost_1_35\\boost/scoped_ptr.hpp", 88));
            return *ptr;
        }
/*保存ポインタが指すオブジェクトへの参照を返します.空の参照は許可されていないため、空のポインタを持つことを解除します.

scoped_ptrは未定義の動作をもたらします.含まれているポインタが有効かどうかを確認できない場合は、関数を使用します.
getは解参照の代わりになります.
この関数は異常を放出しません.*/
        T * operator->() const
        {
            ((ptr != 0) ? (void)0 : _assert( "ptr != 0", "E:\\Program Files\\CodeGear\\RAD Studio\\7.0\\include\\boost_1_35\\boost/scoped_ptr.hpp", 94));
            return ptr;
        }
/*保存したポインタを返します.保存されたポインタが空の場合、この関数を呼び出すと、未定義の動作が発生します.ポインタが不明な場合
空、関数を使用するのが望ましい
get.この関数は異常を放出しません.*/
        T * get() const
        {
            return ptr;
        }
/*保存したポインタを返します.注意深く使うべきだ
getは、裸のポインタを直接操作できるためです.でも、
getは保存をテストできます
ポインタが空かどうか.この関数は異常を放出しません.
getは、通常、裸のポインタを必要とする関数を呼び出すために使用されます.*/
        typedef T * this_type::*unspecified_bool_type;
        operator unspecified_bool_type() const
        {
            return ptr == 0? 0: &this_type::ptr;
        }
/*戻る
scoped_ptrが空でないかどうか.戻り値のタイプは指定されていませんが、このタイプはBooleanのコンテキストで使用できます.
if文では、このタイプの変換関数を使用しないほうがいいです.
getテスト
scoped_ptrの有効性*/
        bool operator! () const
        {
            return ptr == 0;
        }
        void swap(scoped_ptr & b)
        {
            T * tmp = b.ptr;
            b.ptr = ptr;
            ptr = tmp;
        }
/*2つ交換
scoped_ptrの内容.この関数は異常を放出しません.*/
    };
    template inline void swap(scoped_ptr & a, scoped_ptr & b)
    {
        a.swap(b);
    }
/*個の関数は、2つのscoped pointerのコンテンツを交換するより良い方法を提供します.それがもっといいと言ったのは、
  
swap(scoped 1,scoped 2)は、ヌードポインタおよびサードパーティのスマートポインタを含む多くのポインタタイプにより広く使用することができる.
  
[2]
scoped1.swap(scoped 2)は、定義されたスマートポインタのみで使用でき、裸ポインタでは使用できません.*/
    template inline T * get_pointer(scoped_ptr const & p)
    {
        return p.get();
    }
}
使用方法:
scoped_ptrの使い方は普通のポインタと変わらない.最大の違いは、ポインタでdeleteを呼び出す必要がなくなり、コピーが許可されていないことです.通常のポインタ操作(operator*とoperator->)は、リロードされ、裸のポインタと同じ構文が提供されます.scoped_でptrは裸ポインタと同様に速く,大きさの増加もないため広く使用できる.boostの使用::scoped_ptrの場合、ヘッダファイル「boost/scoped_ptr.hpp」を含む.scoped_を宣言するptrの場合、クラステンプレートのパラメータを被指物のタイプで指定します.たとえば、std::stringポインタを含むscoped_ptr:
boost::scoped_ptr<std::string> p(new std::string("Hello"));

scoped_ptrが破棄されると、所有するポインタに対してdeleteが呼び出されます.
違い:
scoped_ptrと
auto_ptr間の違いは主に所有権の処理にある.
auto_ptrはコピー時にソースから
auto_ptrは自動的に所有権を渡し、
scoped_ptrはコピーを許可しません.