0Pricing
C++ Academy · レッスン

unique_ptrによる単独所有

unique_ptrとムーブ専用型で、単独所有の意味を表現します。

「unique_ptrによる単独所有」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

単一所有者のスマートポインター

std::unique_ptr<T>は、ヒープ上の1つのオブジェクトを所有します。unique_ptrが破棄されると、オブジェクトも削除されます。コピーはできず、ムーブだけが可能です。

unique_ptrの作成

std::make_unique(C++14)を使います。例外に対して安全で、簡潔に書けます。

#include <memory>
auto w = std::make_unique<Widget>();         // default-constructed
auto p = std::make_unique<Point>(3, 4);       // forwarded args

ポインターと同じように使う

unique_ptrは通常のポインター操作に対応しています。

auto p = std::make_unique<Point>(3, 4);
std::cout << p->x;        // arrow access
std::cout << (*p).y;      // dereference
if (p) std::cout << "non-null";

コピーはできず、ムーブは可能

コピーすると所有者が2つになり、「unique」という性質に反します。ムーブすると所有権が移ります。

std::unique_ptr<int> a = std::make_unique<int>(1);
std::unique_ptr<int> b = std::move(a);
// a is now empty, b owns the int

関数に渡す

値渡し(std::moveを使用):所有権を移します。参照渡し:所有権を持たずに借用します。

void consume(std::unique_ptr<Widget> w);   // takes ownership
void inspect(const Widget& w);              // borrows

auto w = std::make_unique<Widget>();
consume(std::move(w));
// w is now empty
inspect(*w);                                // (after re-creating)

関数から返す

確保したオブジェクトの所有権を返す関数は、std::unique_ptrを返すべきです。

std::unique_ptr<Widget> create() {
    return std::make_unique<Widget>();
}

リセットと解放

reset()は現在のオブジェクトを削除し、必要に応じて新しいオブジェクトの所有権を取得します。release()は所有権を放棄し、生ポインターを返します。

auto p = std::make_unique<int>(10);
p.reset(new int(20));    // delete the old, own the new
int* raw = p.release();   // p is now empty
delete raw;               // caller must delete

get():生ポインターを借用する

get()は所有権を放棄せずに生ポインターを返します。所有権を持たない連携処理に使います。

auto p = std::make_unique<int>(42);
legacy_api(p.get());      // p still owns it

配列に対するunique_ptr

配列にはunique_ptr<T[]>を使います。[]でインデックスアクセスでき、破棄時にはdelete[]が呼び出されます。

auto arr = std::make_unique<int[]>(10);
arr[0] = 99;
std::cout << arr[0];

カスタムデリーター

リソースが生メモリではない場合(ファイルハンドルやOSリソースなど)は、テンプレート引数としてカスタムデリーターを指定します。

auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(std::fopen("a.txt","r"), closer);

性能

デフォルトのデリーターを使う場合、unique_ptrは生ポインターと同じサイズ・速度で、オーバーヘッドはありません。

クイックチェック

std::unique_ptrがコピーを禁止しているのはなぜですか。

まとめ

std::unique_ptrは標準的なスマートポインターです。オーバーヘッドがなく、排他的な所有権を持ち、ムーブはできますがコピーはできません。構築にはstd::make_uniqueを優先してください。

よくある質問

「unique_ptrによる単独所有」レッスンは無料ですか?

はい。「unique_ptrによる単独所有」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「unique_ptrによる単独所有」で何を学びますか?

unique_ptrとムーブ専用型で、単独所有の意味を表現します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「unique_ptrによる単独所有」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スマートポインターが生のnewとdeleteを置き換える理由
  2. unique_ptrによる単独所有
  3. shared_ptrとweak_ptrによる共有所有
  4. カスタムデリーターとmake関数
← C++ Academyに戻る