Skip to content
Go back

消えたコンストラクタを追え

· Updated:
  • 問題:参照カウントを管理するクラスが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();  // 解放済みのオブジェクトに触ろうとしてエラー発生
}