Bon, avec C++, on manipule bien moins de pointeurs "bruts"
et donc, il y a une grosses source d'erreur pénible
(parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent
à me demander si on ne retrouve pas le même genre de
problème: on oublie que tel opération invalide un
itérateur, et souvent ça marche, sauf un jour de
[mal]chance.
D'où ma question à des gens qui font plus de C++ au quotidien:
les itérateurs invalides:
1) vous en avez peut parce que de toute façon vous
utilisez surtout begin(), end(), begin()+n, et que
ceux là sont toujours valides ;
2) vous en avez peut parce qu'on prend vite l'habitude
d'y faire attention
3) oui, vous en avez autant que d'erreurs de pointeurs
à l'époque ou vous faisiez du C.
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Marc Bourguet
Marc Boyer writes:
Bon, avec C++, on manipule bien moins de pointeurs "bruts" et donc, il y a une grosses source d'erreur pénible (parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent à me demander si on ne retrouve pas le même genre de problème: on oublie que tel opération invalide un itérateur, et souvent ça marche, sauf un jour de [mal]chance.
Socker des iterateurs est effectivement une source de probleme. Mais c'est rare. Donc quasiment le seul cas ou iterateurs invalides apparaissent c'est quand en iterant sur une structure, on appelle une fonction qui rend l'iterateur invalide. C'est generalement assez facile a trouver. Note que j'ai de plus en plus tendance a encapsuler les containers de la SL dans des classes presentant l'interface minimale necessaire, donc la solution peut etre de rendre les iterateurs pour cette struture robustes face aux modifications.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer <Marc.Boyer@enseeiht.yahoo.fr.invalid> writes:
Bon, avec C++, on manipule bien moins de pointeurs "bruts"
et donc, il y a une grosses source d'erreur pénible
(parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent
à me demander si on ne retrouve pas le même genre de
problème: on oublie que tel opération invalide un
itérateur, et souvent ça marche, sauf un jour de
[mal]chance.
Socker des iterateurs est effectivement une source de probleme. Mais
c'est rare. Donc quasiment le seul cas ou iterateurs invalides
apparaissent c'est quand en iterant sur une structure, on appelle une
fonction qui rend l'iterateur invalide. C'est generalement assez
facile a trouver. Note que j'ai de plus en plus tendance a encapsuler
les containers de la SL dans des classes presentant l'interface
minimale necessaire, donc la solution peut etre de rendre les
iterateurs pour cette struture robustes face aux modifications.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Bon, avec C++, on manipule bien moins de pointeurs "bruts" et donc, il y a une grosses source d'erreur pénible (parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent à me demander si on ne retrouve pas le même genre de problème: on oublie que tel opération invalide un itérateur, et souvent ça marche, sauf un jour de [mal]chance.
Socker des iterateurs est effectivement une source de probleme. Mais c'est rare. Donc quasiment le seul cas ou iterateurs invalides apparaissent c'est quand en iterant sur une structure, on appelle une fonction qui rend l'iterateur invalide. C'est generalement assez facile a trouver. Note que j'ai de plus en plus tendance a encapsuler les containers de la SL dans des classes presentant l'interface minimale necessaire, donc la solution peut etre de rendre les iterateurs pour cette struture robustes face aux modifications.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc Boyer
Jean-Marc Bourguet wrote:
Bon, avec C++, on manipule bien moins de pointeurs "bruts" et donc, il y a une grosses source d'erreur pénible (parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent à me demander si on ne retrouve pas le même genre de problème: on oublie que tel opération invalide un itérateur, et souvent ça marche, sauf un jour de [mal]chance.
Socker des iterateurs est effectivement une source de probleme. Mais c'est rare.
OK, on ne stocke pas d'itérateur, et si on le fait, on fait très attention, donc le problème est peu fréquent. C'est le "on ne stocke pas d'itérateur" qui manquait à mon expérience.
Donc quasiment le seul cas ou iterateurs invalides apparaissent c'est quand en iterant sur une structure, on appelle une fonction qui rend l'iterateur invalide. C'est generalement assez facile a trouver.
OK. En effet, le code source de l'erreur et l'endroit où ça va planter, c'est souvent très proche.
Note que j'ai de plus en plus tendance a encapsuler les containers de la SL dans des classes presentant l'interface minimale necessaire, donc la solution peut etre de rendre les iterateurs pour cette struture robustes face aux modifications.
OK
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Jean-Marc Bourguet wrote:
Bon, avec C++, on manipule bien moins de pointeurs "bruts"
et donc, il y a une grosses source d'erreur pénible
(parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent
à me demander si on ne retrouve pas le même genre de
problème: on oublie que tel opération invalide un
itérateur, et souvent ça marche, sauf un jour de
[mal]chance.
Socker des iterateurs est effectivement une source de probleme. Mais
c'est rare.
OK, on ne stocke pas d'itérateur, et si on le fait, on fait
très attention, donc le problème est peu fréquent.
C'est le "on ne stocke pas d'itérateur" qui manquait à
mon expérience.
Donc quasiment le seul cas ou iterateurs invalides
apparaissent c'est quand en iterant sur une structure, on appelle une
fonction qui rend l'iterateur invalide. C'est generalement assez
facile a trouver.
OK. En effet, le code source de l'erreur et l'endroit où ça
va planter, c'est souvent très proche.
Note que j'ai de plus en plus tendance a encapsuler
les containers de la SL dans des classes presentant l'interface
minimale necessaire, donc la solution peut etre de rendre les
iterateurs pour cette struture robustes face aux modifications.
OK
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
Bon, avec C++, on manipule bien moins de pointeurs "bruts" et donc, il y a une grosses source d'erreur pénible (parce qu'indéterministe) qui a disparu.
Maintenant, mes premiers pas avec les itérateurs m'ammènent à me demander si on ne retrouve pas le même genre de problème: on oublie que tel opération invalide un itérateur, et souvent ça marche, sauf un jour de [mal]chance.
Socker des iterateurs est effectivement une source de probleme. Mais c'est rare.
OK, on ne stocke pas d'itérateur, et si on le fait, on fait très attention, donc le problème est peu fréquent. C'est le "on ne stocke pas d'itérateur" qui manquait à mon expérience.
Donc quasiment le seul cas ou iterateurs invalides apparaissent c'est quand en iterant sur une structure, on appelle une fonction qui rend l'iterateur invalide. C'est generalement assez facile a trouver.
OK. En effet, le code source de l'erreur et l'endroit où ça va planter, c'est souvent très proche.
Note que j'ai de plus en plus tendance a encapsuler les containers de la SL dans des classes presentant l'interface minimale necessaire, donc la solution peut etre de rendre les iterateurs pour cette struture robustes face aux modifications.
OK
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Alexandre
personnelement je n'ai pas de souci avec les iterateurs invalides, parce que je ne les stocke pas : je m'en sers avec les algos type std::find, et sinon pour iterer, afficher le contenu d'un std::list par exemple, j'utilise les algos standards (std::for_each). J'ai eu avant quelques soucis parce que je faisais des itérations "à la main" avec des erase au milieu ;-) Mais ça n'arrive plus... Je ne déclare non plus jamais un itérateur sans l'initialiser, avec un begin() ou le résultat d'un std::find par exemple
D'où bcp moins de soucis qu'avec des pointeurs à l'époque où je faisais du C...
personnelement je n'ai pas de souci avec les iterateurs invalides, parce que
je ne les stocke pas : je m'en sers avec les algos type std::find, et sinon
pour iterer, afficher le contenu d'un std::list par exemple, j'utilise les
algos standards (std::for_each).
J'ai eu avant quelques soucis parce que je faisais des itérations "à la
main" avec des erase au milieu ;-)
Mais ça n'arrive plus...
Je ne déclare non plus jamais un itérateur sans l'initialiser, avec un
begin() ou le résultat d'un std::find par exemple
D'où bcp moins de soucis qu'avec des pointeurs à l'époque où je faisais du
C...
personnelement je n'ai pas de souci avec les iterateurs invalides, parce que je ne les stocke pas : je m'en sers avec les algos type std::find, et sinon pour iterer, afficher le contenu d'un std::list par exemple, j'utilise les algos standards (std::for_each). J'ai eu avant quelques soucis parce que je faisais des itérations "à la main" avec des erase au milieu ;-) Mais ça n'arrive plus... Je ne déclare non plus jamais un itérateur sans l'initialiser, avec un begin() ou le résultat d'un std::find par exemple
D'où bcp moins de soucis qu'avec des pointeurs à l'époque où je faisais du C...
Marc Boyer
Alexandre wrote:
personnelement je n'ai pas de souci avec les iterateurs invalides, parce que je ne les stocke pas : je m'en sers avec les algos type std::find, et sinon pour iterer, afficher le contenu d'un std::list par exemple, j'utilise les algos standards (std::for_each). J'ai eu avant quelques soucis parce que je faisais des itérations "à la main" avec des erase au milieu ;-) Mais ça n'arrive plus...
OK, ne pas stocker d'itérateur, c'est ça la règle qui me manquait.
D'où bcp moins de soucis qu'avec des pointeurs à l'époque où je faisais du C...
OK Merci
-- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Alexandre wrote:
personnelement je n'ai pas de souci avec les iterateurs invalides, parce que
je ne les stocke pas : je m'en sers avec les algos type std::find, et sinon
pour iterer, afficher le contenu d'un std::list par exemple, j'utilise les
algos standards (std::for_each).
J'ai eu avant quelques soucis parce que je faisais des itérations "à la
main" avec des erase au milieu ;-)
Mais ça n'arrive plus...
OK, ne pas stocker d'itérateur, c'est ça la règle qui me manquait.
D'où bcp moins de soucis qu'avec des pointeurs à l'époque où je faisais du
C...
OK
Merci
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
personnelement je n'ai pas de souci avec les iterateurs invalides, parce que je ne les stocke pas : je m'en sers avec les algos type std::find, et sinon pour iterer, afficher le contenu d'un std::list par exemple, j'utilise les algos standards (std::for_each). J'ai eu avant quelques soucis parce que je faisais des itérations "à la main" avec des erase au milieu ;-) Mais ça n'arrive plus...
OK, ne pas stocker d'itérateur, c'est ça la règle qui me manquait.
D'où bcp moins de soucis qu'avec des pointeurs à l'époque où je faisais du C...
OK Merci
-- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.