Недавно я обнаружил, что большинство ошибок в моих программах на 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 (значение xyzn установлено в get_x ()), но создание «Big b» перезаписывает временный Z. В результате ссылка на временный Z в объекте Y теперь перезаписывается с помощью Big b, и, следовательно,вывод не то, что я ожидал.
Когда я скомпилировал эту программу с помощью gcc 4.5 с опцией "-Wall", он не выдал предупреждение.
Исправление, очевидно, удаляет ссылку изчлен Z в классе Y. Однако часто класс Y является частью библиотеки, которую я не разрабатывал (boost :: fusion совсем недавно), и, кроме того, ситуация намного сложнее, чем в этом примере, который я привел.
Это какая-то опция для gcc или любого дополнительного программного обеспечения, которое позволило бы мне обнаруживать такие проблемы предпочтительно во время компиляции, но даже время выполнения было бы лучше, чем ничего?
Спасибо,
Клинтон