- 問題:参照カウントを管理するクラスがaccess violationを吐く
- コピー時に参照カウントが増えず、早期に解放されていた
- 周辺の挙動をトレースしてみると、コピーコンストラクタが呼び出されていなかった
- 原因:コピーコンストラクタを定義し忘れていた
- 自身の型を含むテンプレートのコンストラクタがコピーコンストラクタの代替になると勘違いしていた
- 結果、暗黙的に宣言されたコピーコンストラクタが呼び出されてしまい、参照カウントの増加が行われなかった
template <typename T>
struct S {
// ユーザー定義のコンストラクタ。const S<T>&を含む
template <typename U>
S(const S<U>& other) {
// 参照カウントを増やす処理
}
~S() {
// 参照カウントをへらす処理
}
// 暗黙的に宣言されるコピーコンストラクタ
// S(const S&) = default;
};
struct SS {
S<X> sx;
S<Y> sy;
}
S<X> foo() {
SS ss = get_ss();
return ss.sx; // 暗黙的に宣言されるコピーコンストラクタが呼び出される
}
void bar() {
S<X> sx = foo();
sx.func(); // 解放済みのオブジェクトに触ろうとしてエラー発生
}