Как определить постоянную ссылку на временные проблемы при компиляции или во время выполнения?

Недавно я обнаружил, что большинство ошибок в моих программах на 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 или любого дополнительного программного обеспечения, которое позволит мне обнаруживать такие проблемы предпочтительно во время компиляции, но даже время выполнения было бы лучше, чем ничего?

Спасибо,

Клинтон

8
задан Clinton 1 December 2010 в 02:10
поделиться