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 6:関数について

Day 6では、関数について学習します。 関数は、プログラム内で特定のタスクを実行するために使用されるブロック(サブルーチン)です。関数はメインプログラムから呼び出すことができ、再利用性とコードの構造 …

【C++】Day 8:オブジェクト指向プログラミング(OOP)の基礎

Day 8では、オブジェクト指向プログラミング(OOP)の基礎について学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   オブジェクト指向プログラミングの基礎 …

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

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

【C++】Day 24:デバッグとテスト

Day 24では、デバッグとテストについて学習します。 プログラムを書く際には、バグを見つけて修正するデバッグや、プログラムが正しく動作することを確認するテストが重要です。 以下にデバッグとテストに関 …

【C++】Day 10:継承とポリモーフィズム

Day 10では、継承とポリモーフィズムについて学習します。 以下にそれぞれの内容を詳細に説明します。   継承: 1. 継承の概念: – 継承は、既存のクラス(ベースクラスまた …