## 19.2 自動ポインタの宣言と初期化

auto_ptr オブジェクトとポインタを関連づけるには、auto_ptr にいずれかのコンストラクタを使用するか、auto_ptr オブジェクトを別の auto_ptr オブジェクトに割り当てるか、reset メンバー関数を使用します。デフォルトですべての auto_ptr を所有する NULL ポインタを除いて、一度に特定のポインタを所有するのは 1 つの auto_ptr に限られます。auto_ptr コピーコンストラクタまたは代入演算子を使用すると、所有権が、ある auto_ptr オブジェクトから別の auto_ptr オブジェクトへ移ります。たとえば、以下のような auto_ptr `a` を作成するとします。

    auto_ptr<string> a(new string);

この auto_ptr オブジェクト `a` は、新規に作成されたポインタを所有しています。`a` が範囲外などの理由で破壊されると、ポインタは削除されます。ただし次のように、代入演算子を使用して `a` を `b` に代入すると、`b` がこのポインタを所有します。

    auto_ptr<string> b = a;

代入演算子の使用により、`a` はポインタの所有権を解放します。これで `a` が範囲外となっても、ポインタは影響を受けません。ただし、`b` が範囲外となるとポインタは削除されます。

`a` のコンストラクタ内で `new` を使用するような構造は、削除の役割を割り当て担当のエンティティとは別のエンティティに課すことになるため、回避するのが普通です。ただし、この場合は、auto_ptr の唯一の役割は削除を管理することです。この構文は、ポインタを偶発的に削除することを防止するために、実際にはよく使用されます。

auto_ptr に保持されているポインタにアクセスするには、`operator*`、`operator->`、メンバー関数 `get()` を使用します。たとえば、以下の 3 つのいずれかの文を使用して、`"What's up Doc"` を auto_ptr `b` によって指示される文字列に代入することができます。

    *b = "What's up Doc";
    *(b.get()) = "What's up Doc";
     b->assign("What's up Doc");

クラス auto_ptr は、ポインタの所有権を解放する release メンバー関数も備えています。特定のポインタを所有しない auto_ptr は、NULL ポインタを指示すると想定されており、auto_ptr に release を呼び出すと、auto_ptr は NULL ポインタに設定されます。上記の例では、`a` が `b` に代入されるため、`a` が保持するポインタは解放されて、`a` は NULL ポインタに設定されます。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月