メインコンテンツにスキップ
モジュール 7 · レッスン 1 / 2コース内の 15/18~12 min
モジュールのレッスン (1/2)

std::unique_ptr および std::shared_ptr

従来の C++ では、new および delete 演算子を使用した手動メモリ管理は、メモリ リーク (リソースが解放されない) やダングリング ポインタ (割り当て解除されたメモリを指すポインタ) などのバグの一般的な原因となります。

最新の C++ では、<memory> ヘッダーで定義される スマート ポインター が導入されています。これらは、RAII (リソース取得は初期化) を使用してヒープに割り当てられたメモリのライフサイクルを自動的に管理し、スマート ポインターがスコープ外になったときにリソースの割り当てを解除します。

std::unique_ptr

std::unique_ptr は、リソースの 排他的所有権 の概念を実装します。コピーすることはできません。(std::move 経由で) 移動のみ可能です。

C++
#include <memory>

// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);

// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;

// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2

std::shared_ptr

std::shared_ptr は 共有所有権 の概念を実装します。複数のスマート ポインターが同じリソースを指すことができます。このクラスは内部で参照カウントを維持します。メモリは、最後のアクティブな shared_ptr が破棄またはリセットされた場合にのみ解放されます。

C++
#include <memory>

std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count

std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)

自分で試してみてください

運動#cpp.m7.l1.e1
試行回数: 0読み込み中…

ptr という名前の std::unique_ptr<int> を宣言し、値 42 を保持する std::make_unique で初期化します。 std::cout を使用して、 ptr の逆参照値を出力します。

エディターを読み込み中…
ヒントを表示

`std::unique_ptr<int> ptr = std::make_unique<int>(42);` を使用し、`*ptr` を出力ストリームに送信します。

3 回の試行後に解決策が利用可能になります

運動#cpp.m7.l1.e2
試行回数: 0読み込み中…

std::make_shared を使用して、値 100 を持つ ptr1 という名前の std::shared_ptr<int> をインスタンス化します。 ptr2 という名前のコピーを作成し、std::cout を使用して ptr1.use_count() によって返された値を出力します。

エディターを読み込み中…
ヒントを表示

コピーは標準の割り当て「ptr2 = ptr1;」によって行われます。 `ptr1.use_count()` を印刷すると 2 が表示されるはずです。

3 回の試行後に解決策が利用可能になります