以下最小化程序在使用 编译时-O3
可能会出现段错误-O2
,但使用-O0
(使用 clang 4.0)执行良好:
#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
鉴于我不控制B
or的实施,我可以采用哪些良好做法来避免这种情况A
?是否有能够检测到这种情况的静态分析仪?(我的版本scan-build
没有发现问题。)
相关:检测对临时的悬空引用