HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day 13:メモリ管理とスマートポインタ

投稿日:

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` を持たせてください。また、コンストラクタで配列のサイズを受け取り、動的にメモリを確保してください。

これらの例題と演習問題を解くことで、メモリ管理の重要性を理解し、スマートポインタの使い方を習得することができます。問題を解いたら、メモリの確保と解放が正しく行われているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【C++】Day 27:デザインパターン「構造型パターン」

Day 27では、デザインパターンのうち「構造型パターン」について学習します。 構造型パターンは、クラスやオブジェクトの構造を改良するためのパターンです。主な構造型パターンには、アダプタ、デコレータ、 …

【C++】Day 2:変数とデータ型について

Day 2では、変数とデータ型について学習します。 変数はデータを格納するためのメモリ上の領域であり、データ型はその変数が保持できるデータの種類を指定します。 C++にはいくつかの基本的なデータ型があ …

【C++】Day 21:ネットワークプログラミングの基礎

Day 21では、ネットワークプログラミングの基礎について学習します。 ネットワークプログラミングは、コンピュータ間でデータを送受信するプログラミングのことを指します。主にソケットを使用してネットワー …

【C++】Day 14:C++における文字列操作

Day 14では、C++における文字列操作について学習します。 C++では標準ライブラリである`<string>`を使用して、文字列を操作することができます。 以下に文字列操作の主な内容と …

【C++】Day 3:C++の演算子について

Day 3では、C++の演算子について学習します。 演算子はプログラム内で値を操作するための特殊な記号やキーワードです。 C++には様々な演算子が存在し、数値演算、論理演算、代入演算などがあります。以 …