-O3
次の最小限っぽいプログラムは、およびおそらく を使用してコンパイルすると segfault が発生しますが、 (clang 4.0 を使用すると) で-O2
正常に実行されます。-O0
#include <iostream>
class A {
public:
virtual void me() const { std::cerr << "hi!\n"; }
};
class B {
public:
B(const A& a_) : a(a_) {}
virtual void me() const { a.me(); }
private:
const A& a;
};
class C {
public:
C(const B& b_) : b(b_) {}
void me() const { b.me(); }
public:
const B& b;
};
int main() {
C c = C(A());
c.me();
}
その理由は、一時オブジェクトから構築されたc.b
クラスの一時オブジェクトへの参照で初期化されるためです。コンストラクターが終了すると、一時的なものはなくなりますが、それへの参照は に残ります。B
A
c.C()
B
c.b
orの実装を制御できない場合、この状況を回避するためにどのような良い方法を採用できますB
かA
? この状態を検出できる静的アナライザーはありますか? (私のバージョンのscan-build
では問題が見つかりませんでした。)