J'ai trouvé récemment que la plupart des erreurs dans mon C++ programmes sont de une forme comme l'exemple suivant:Comment détecter la référence const à des problèmes temporaires lors de la compilation ou de l'exécution?
#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;
}
SORTIE: 1000
Je me attends à ce programme à la sortie 123 (la valeur de xyzn définie dans get_x()) mais la création de "Big b" écrase le Z temporaire. En tant que résultat , la référence au Z temporaire dans l'objet Y est maintenant écrasée avec Big b, et donc la sortie Ce n'est pas ce que j'attendrais de . Lorsque j'ai compilé ce programme avec gcc 4.5 avec l'option "-Wall", n'a donné aucun avertissement.
Le correctif est évidemment de supprimer la référence de l'élément Z dans la classe Y. Cependant, souvent la classe Y fait partie d'une bibliothèque que je n'ai pas développé (boost :: fusion la plus récente), et en plus la situation est beaucoup plus compliquée que cet exemple que j'ai donné.
Y at-il une sorte d'option à gcc, ou tout autre logiciel que me permettrait de détecter de tels problèmes de préférence au moment de la compilation, mais même runtime serait mieux que rien?
Merci,
Clinton
Je suis un peu surpris que vous obteniez 1000 au lieu de 1123. – Gabe
Gabe: Pourquoi 1123? Le constructeur de Big définit l'élément zeroth = 1000. Il n'ajoute pas 1000 à l'élément zeroth. Si c'était {a [i] + = i + 1000; } Je pouvais voir d'où tu venais. – Clinton
En relation: https://stackoverflow.com/q/42340073/946850 – krlmlr