Salut,
Je suis pris d'un doute subit en ce qui concerne la std::list...
Je sais (ou du moins, je crois savoir) que l'insertion ne va pas invalider les pointeurs sur les objets qu'elle contient, et que la suppression ne va invalider que le pointeur sur l'objet supprimé.
Ainsi, normalement, si je prévois un code proche de
ptr devrait toujours être valide après la seconde insertion, ainsi qu'après l'effacement d'un objet tant que ce n'est pas l'objet pointé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 std::list<UnType> l; l.push_back(Untype); /*... */ UnType * ptr*=&(*(l.begin()); l.push_back(UnType); /* ptr reste valide *... */ l.erase(l.rbegin()); /* ptr est toujours valide, pour autant que la suppression n'ai pas * porté sur l'objet pointé */
Mais qu'en est il de la fonction membre sort
Se contente-t-elle de refaire les différentes liaisons entre les itérateurs, sans invalider ptr (selon l'exemple) ou va-t-elle carrément créer des copies des différents objets, ce qui reviendra à ... invalider ptr.
Sur mon système (Gcc 4.5.0), il semblerait que ptr ne soit pas invalidé, mais est-ce le comportement que l'on est réellement en droit d'attendre
Et la question connexe: est-il ne serait-ce qu'intéressant d'envisager l'usage d'un shared_ptr quelconque pour représenter ptr
Partager