最近、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 へのある種のオプション、またはそのような問題をできればコンパイル時に検出できる追加のソフトウェアがありますが、ランタイムでさえ何もないよりはましでしょうか?
ありがとう、
クリントン