我最近发现我的 C++ 程序中的大多数错误都类似于以下示例:
#include <iostream>
class Z
{
public:
Z(int n) : n(n) {}
int n;
};
class Y
{
public:
Y(const Z& z) : z(z) {}
const Z& z;
};
class X
{
public:
X(const Y& y) : y(y) {}
Y y;
};
class Big
{
public:
Big()
{
for (int i = 0; i < 1000; ++i) { a[i] = i + 1000; }
}
int a[1000];
};
X get_x() { return X(Y(Z(123))); }
int main()
{
X x = get_x();
Big b;
std::cout << x.y.z.n << std::endl;
}
输出:1000
我希望这个程序输出 123(在 get_x() 中设置的 xyzn 的值),但是“Big b”的创建覆盖了临时 Z。结果,对象 Y 中对临时 Z 的引用现在被覆盖了大 b,因此输出不是我所期望的。
当我使用带有选项“-Wall”的 gcc 4.5 编译这个程序时,它没有给出任何警告。
解决方法显然是从 Y 类中的成员 Z 中删除引用。但是,通常 Y 类是我尚未开发的库的一部分(最近的 boost::fusion),此外情况要复杂得多比我给出的这个例子。
这有某种 gcc 选项,或者任何其他软件可以让我最好在编译时检测到此类问题,但即使运行时也总比没有好?
谢谢,
克林顿