que he encontrado recientemente que la mayoría de los errores en mi C++ programas son de una forma similar al ejemplo siguiente:¿Cómo detectar la referencia constante a problemas temporales durante la compilación o el tiempo de ejecución?
#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;
}
SALIDA: 1000
que se puede esperar de este programa para dar salida a 123 (el valor de xyzn establecido en get_x()) pero la creación de "Big b" sobrescribe la Z temporal. Como resultado , la referencia a la Z temporal en el objeto Y ahora es sobrescrito con Big b, y por lo tanto la salida no es lo que yo esperaría .
Cuando compilé este programa con gcc 4.5 con la opción "-Wall", no dio ninguna advertencia.
La solución es obviamente para eliminar la referencia desde el miembro de Z en el Y. clase Sin embargo, a menudo la clase Y es parte de una biblioteca que no tengo desarrollado (boost :: fusión más recientemente), y además la situación es mucho más complicada que este ejemplo que he dado.
Esto tiene algún tipo de opción para gcc, o cualquier software adicional que me permita detectar tales problemas preferiblemente en tiempo de compilación, pero incluso el tiempo de ejecución sería mejor que nada?
Gracias,
Clinton
Estoy un poco sorprendido de que obtenga 1000 en lugar de 1123. – Gabe
Gabe: ¿Por qué 1123? El constructor de Big establece el elemento zeroth = 1000. No agrega 1000 al elemento zeroth. Si fue {a [i] + = i + 1000; } Pude ver de dónde vienes. – Clinton
Relacionado: https://stackoverflow.com/q/42340073/946850 – krlmlr