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 11:「ファイル入出力」と「例外処理」

Day 11のトピックとして、「ファイル入出力」と「例外処理」について学習します。   ファイル入出力: 1. ファイル入出力の概要: – ファイル入出力は、プログラムと外部のフ …

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

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

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

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

【C++】Day 5:制御文の一つであるループについて

Day 5では、制御文の一つであるループについて学習します。 ループは、特定の処理を繰り返し実行するための構文です。C++には主に3種類のループがあります:forループ、whileループ、do-whi …

【C++】Day 22:ネットワークプログラミングにおけるソケットとプロトコル

Day 22では、ネットワークプログラミングにおけるソケットとプロトコルについて学習します。 ソケットは、ネットワーク通信を行うためのプログラムインターフェースであり、プロトコルは通信のルールや方法を …