第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メンバ関数