第3章:テストとデバッグ

はじめに

本章では、CPP Module 01のテストとデバッグ方法を解説します。

---

1. メモリリークの検出

1.1 Valgrindでのテスト

# ex00のテスト
valgrind --leak-check=full ./zombie

# 期待される結果
==12345== All heap blocks were freed -- no leaks are possible

1.2 よくあるメモリエラー

delete[]を忘れる:

Zombie* horde = zombieHorde(5, "Zombie");
// delete[] horde;  // これを忘れるとメモリリーク

delete と delete[] の混同:

Zombie* horde = new Zombie[5];
delete horde;    // 間違い!
delete[] horde;  // 正しい

---

2. 各演習のテストケース

2.1 ex02: アドレスの確認

./brain

# 期待される出力例
Address of str:       0x7ffd5e8a1234
Address of stringPTR: 0x7ffd5e8a1234
Address of stringREF: 0x7ffd5e8a1234
Value of str:         HI THIS IS BRAIN
Value of stringPTR:   HI THIS IS BRAIN
Value of stringREF:   HI THIS IS BRAIN

3つのアドレスが同じであることを確認。

2.2 ex04: ファイル置換

# テストファイル作成
echo "Hello World World" > test.txt

# 実行
./replace test.txt World Universe

# 確認
cat test.txt.replace
# 期待: Hello Universe Universe

2.3 ex05-06: Harlのテスト

./harl DEBUG
# [ DEBUG ] メッセージのみ

./harlFilter INFO
# [ INFO ] 以上のすべてのメッセージ

---

3. よくある間違い

3.1 参照の初期化忘れ

class HumanA {
    Weapon& _weapon;  // 参照メンバ

    // 間違い:初期化リストなし
    HumanA(const std::string& name) {
        // エラー!参照は初期化必須
    }

    // 正しい:初期化リストで初期化
    HumanA(const std::string& name, Weapon& weapon)
        : _weapon(weapon) {}
};

3.2 ファイルストリームのエラーチェック

std::ifstream file(filename.c_str());
if (!file) {
    std::cerr << "Error opening file" << std::endl;
    return 1;
}
// 常にファイルオープンの成功を確認

---

4. 提出前チェックリスト

  • [ ] 全ての演習がコンパイルできる
  • [ ] メモリリークがない(Valgrind確認)
  • [ ] ファイルが正しく閉じられている
  • [ ] 参照とポインタの使い分けが適切
  • [ ] switch文でfall-throughが正しく動作

---

まとめ

CPP Module 01では以下を確認:

  • メモリ管理(new/delete)
  • 参照とポインタの違い
  • ファイル入出力
  • ポインタtoメンバ関数