モジュールのレッスン (1/2)
std::unique_ptr および std::shared_ptr
従来の C++ では、new および delete 演算子を使用した手動メモリ管理は、メモリ リーク (リソースが解放されない) やダングリング ポインタ (割り当て解除されたメモリを指すポインタ) などのバグの一般的な原因となります。
最新の C++ では、<memory> ヘッダーで定義される スマート ポインター が導入されています。これらは、RAII (リソース取得は初期化) を使用してヒープに割り当てられたメモリのライフサイクルを自動的に管理し、スマート ポインターがスコープ外になったときにリソースの割り当てを解除します。
std::unique_ptr
std::unique_ptr は、リソースの 排他的所有権 の概念を実装します。コピーすることはできません。(std::move 経由で) 移動のみ可能です。
#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 p2std::shared_ptr
std::shared_ptr は 共有所有権 の概念を実装します。複数のスマート ポインターが同じリソースを指すことができます。このクラスは内部で参照カウントを維持します。メモリは、最後のアクティブな shared_ptr が破棄またはリセットされた場合にのみ解放されます。
#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)自分で試してみてください
ptr という名前の std::unique_ptr<int> を宣言し、値 42 を保持する std::make_unique で初期化します。 std::cout を使用して、 ptr の逆参照値を出力します。
ヒントを表示
`std::unique_ptr<int> ptr = std::make_unique<int>(42);` を使用し、`*ptr` を出力ストリームに送信します。
3 回の試行後に解決策が利用可能になります
std::make_shared を使用して、値 100 を持つ ptr1 という名前の std::shared_ptr<int> をインスタンス化します。 ptr2 という名前のコピーを作成し、std::cout を使用して ptr1.use_count() によって返された値を出力します。
ヒントを表示
コピーは標準の割り当て「ptr2 = ptr1;」によって行われます。 `ptr1.use_count()` を印刷すると 2 が表示されるはずです。
3 回の試行後に解決策が利用可能になります