More Related Content
More from 京大 マイコンクラブ (20)
よいコード、わるいコード
- 22. 22/28
const教
● const教 is 何?
– ローカル変数を含めたあらゆるオブジェクト・関数にでき
るだけconst修飾を施す思想のこと。
– constを付けずに書けるところでも、できるだけconstを
使って書くようにする。
– const教らしいコードの例
● constをつければ実際安心!
const int n = [](){
int tmp = 0;
cin >> tmp;
return tmp;
}();
- 24. 24/28
No new, No delete
●
悪い例
secondの確保に失敗した場合、firstがリークする!
struct X {
X() : first(new int(1)),
second(new int(2)) {}
~X() {
delete first;
delete second;
}
int *first, *second;
};
- 25. 25/28
No new, No delete
●
良い例
IntPtrがそれぞれのリソースを管理するのでリーク
しない!
struct IntPtr {
IntPtr(int n) : ptr(new int(n)) {}
~IntPtr() { delete ptr; }
int *ptr;
};
struct X {
X() : first(1), second(2) {}
IntPtr first, second;
};
- 26. 26/28
No new, No delete
●
もっと良い例
newやdeleteは自分で書かない!
template <typename T, typename... Args>
unique_ptr<T> make_unique(Args&&... args) {
return unique_ptr<T>(
new T(forward<Args>(args)...));
}
struct X {
X() : first(make_unique<int>(1)),
second(make_unique<int>(2)) {}
unique_ptr<int> first, second;
};
- 27. 27/28
No new, No delete
● 訓練されたC++erはdeleteを書かない
– newもラップして使うので、直接書かない。
● デストラクタは1つの仕事だけをする
– デストラクタが複数の仕事をしている。
→ 対応する複数の初期化が存在する。
→ 複数の仕事は同時にはできない。
→ 一部しか初期化が済んでない段階で例外が投げら
れると不整合が発生する。
→ 例外安全でない。