Day 13では、メモリ管理とスマートポインタについて学習します。
C++では、メモリの確保と解放を適切に行うことが重要です。スマートポインタは、メモリの自動管理を行う便利な機能です。
以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。
メモリ管理:
1. メモリ確保と解放:
– プログラムが実行される際、必要なメモリ領域を確保する必要があります。
– メモリ確保は、`new` キーワードを使用します。
– メモリ解放は、`delete` キーワードを使用します。
– メモリ確保した後は、必ず解放する必要があります。そうでないと、メモリリークが発生します。
スマートポインタ:
1. スマートポインタの概要:
– スマートポインタは、メモリの自動管理を行うC++の機能です。
– スマートポインタは、通常のポインタと同じように振る舞いますが、メモリ解放の責任を持ちます。
2. unique_ptr:
– `std::unique_ptr` は、単一の所有者を持つスマートポインタです。
– ポインタが不要になった時点で自動的にメモリを解放します。
3. shared_ptr:
– `std::shared_ptr` は、複数の所有者を持つスマートポインタです。
– 参照カウントを用いて、最後の所有者が解放される時点でメモリを解放します。
4. weak_ptr:
– `std::weak_ptr` は、`std::shared_ptr` の循環参照問題を解決するために使用されます。
例題:
#include <iostream> #include <memory> class MyClass { public: MyClass(int val) : value(val) { std::cout << "Constructor called. Value: " << value << std::endl; } ~MyClass() { std::cout << "Destructor called. Value: " << value << std::endl; } void display() { std::cout << "Value: " << value << std::endl; } private: int value; }; int main() { // unique_ptrを使用した例 std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>(10); uniquePtr->display(); // shared_ptrを使用した例 std::shared_ptr<MyClass> sharedPtr1 = std::make_shared<MyClass>(20); std::shared_ptr<MyClass> sharedPtr2 = sharedPtr1; sharedPtr1->display(); sharedPtr2->display(); return 0; }
演習問題:
1. `std::unique_ptr` を使用して、文字列を格納するクラス `StringHolder` を定義してください。このクラスには、文字列を保持するための `std::unique_ptr` メンバ変数と、文字列を表示するメソッド `display` を持たせてください。
2. `std::shared_ptr` を使用して、整数の配列を格納するクラス `IntArray` を定義してください。このクラスには、整数の配列を保持するための `std::shared_ptr` メンバ変数と、配列の要素を表示するメソッド `display` を持たせてください。また、コンストラクタで配列のサイズを受け取り、動的にメモリを確保してください。
これらの例題と演習問題を解くことで、メモリ管理の重要性を理解し、スマートポインタの使い方を習得することができます。問題を解いたら、メモリの確保と解放が正しく行われているかどうかを確認してみてください。