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