Nous avons été mordue à plusieurs reprises ci-dessous:Comment activer la comparaison relationnelle de pointeurs dans une erreur?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int* pn) { cout << *pn << " "; }
int main() {
int* n1 = new int(1);
int* n2 = new int(2);
int* n3 = new int(3);
vector<int*> v;
v.push_back(n1);
v.push_back(n2);
v.push_back(n3);
sort(v.begin(), v.end()); // Here be dragons!
for_each(v.begin(), v.end(), print);
cout << endl;
delete n1; delete n2; delete n3;
}
Le problème est que std :: sort compare les pointeurs entiers non entiers, ce qui est pas ce que le programmeur prévu. Pire, la sortie peut apparaître correcte et déterministe (considérez l'ordre des adresses renvoyées par new ou allouées sur la pile). Le problème racine est que le tri appelle éventuellement l'opérateur < pour T, ce qui est rarement une bonne idée lorsque T est un type de pointeur.
Est-il possible d'empêcher cela ou au moins d'obtenir un avertissement du compilateur? Par exemple, existe-t-il un moyen de créer une version personnalisée de std :: sort que requiert une fonction de comparaison lorsque T est un pointeur?
Nous avons tous été mordus par ce bug plusieurs fois. C'est pourquoi j'étais intéressé par cette question. Je ne pense pas que quelqu'un l'ait vraiment craqué, cependant. Ce dont nous avons besoin, c'est de faire en sorte que ce genre de chose ne se compile pas, donc quand vous le faites après une autre nuit, il ne peut pas rester dans le code. –
Chaque fois que j'essaie de trouver quelque chose d'utile à dire ici, tout se résume à "obtenir des développeurs plus intelligents". Ensuite, je réalise que des choses simples comme celles-ci arrivent aussi aux développeurs intelligents. Conservez certainement des notes (wiki?) Sur les bogues les plus recherchés qui apparaissent sur votre code, et portez-y une attention particulière lors des révisions de code. Doublement sur les développeurs juniors. – corsiKa