Tu insistes beaucoup sur les pointeurs intelligents, mais ce n'est pas à ça que je pensais, j'en ai parlé comme solution à envisager si on a besoin de mémoire dynamique, mais je pensais surtout à privilégier la mémoire automatique, et utiliser des références, pas des pointeurs. Ca peut paraitre évident, mais c'est une habitude trop peu répandue (surtout si on a fait du C avant).
Oui mais dès que tu as besoin d'instancier des classes tu utilises l'opérateur new et donc l'allocation dynamique (oui on peut parfaitement utiliser la pile et non la heap mais la pile n'est pas vraiment faite pour les objets donc on fait rarement de cette façon). On fait de l'objet ne l'oublions pas donc l'objectif est d'utiliser des classes. Dès que tu utilises des objets tu es pratiquement obligé de renoncer à la mémoire automatique et la desallocation se fait à la main. Si j'ai insisté sur les pointeurs intelligents c'est parce que ça montre un besoin de la part des programmeurs d'avoir un système de gestion mémoire automatique (ce que possède Java).
Je ne dis pas qu'il n'y a pas de cas avec vector où il faut utiliser de la mémoire dynamique (avec des pointeurs dans le vecteur par exemple), mais on peut quand même souvent s'en passer
Pour reprendre mon exemple, mes comptes ce sont évidemment des objets (ce n'était peut-être pas très clair) qui contiennent des informations relatives à chaque compte et à chaque nouveau compte récupéré j'instancie mon objet compte que je place dans un vector (de pointeurs à cause des objets que je mets dedans) à des fins d'affichage, dans ce cas on est d'accord j'utilise bien la mémoire dynamique et là si on place des objets compte chèque et compte titre qui sont dérivés de compte on doit effectuer le nettoyage à la main. On pourrait trouver des dizaines d'exemples du même type.
Et en plus la mémoire automatique est plus rapide, et tout se passe bien avec les exceptions...
Oui je suis d'accord mais avec cet exemple là :
Compte *l_compte = new Compte;
l_compte->changerProprietaire(nom);
//d'autres trucs ici
delete l_compte;
Si ma fonction lève une exception je ne passe pas au niveau du delete et mon pointeur n'est jamais libéré.
(Et je ne suis pas d'accord si tu dis que la mémoire automatique c'est laisser au programmeur la gestion de la mémoire. Quand on utilise des pointeurs oui, mais là ce n'est pas le cas)
Loin de moi l'idée de dire que des variables automatiques sont gérées par le programmeurs (quand même ! ;-), pour les pointeurs oui on est d'accord mais là où je ne suis pas d'accord c'est que ce n'est pas aussi simple que ça de ne pas utiliser de pointeurs. Tu inclus d'ailleurs dans ton raisonnement l'utilisation de pointeurs intelligents comme un "best pratice" pour faire du code sûr mais tout ça ce n'est en quelque sorte que du "bricolage" par rapport à ce qui est fait en Java ... c'est un peu comme dire qu'on peut faire de l'objet en C ... oui on peut mais ce n'est pas spécialement pensé pour. C'est la même chose avec le C++.
Si mes souvenirs sont bons, Java ne propose pas de mémoire automatique, on passe toujours par un new ? Si c'est bien le cas, ça me paraît abusif de dire que Java corrige un problème de C++, parce que c'est en partie supprimer quelque chose d'utile et qui ne posait pas de problème. Mais je peux me tromper sur ce point, ou ça a peut-etre été introduit depuis ma dernière utilisation...
Des variables ont des portées de bloc ou de méthode en Java aussi, elle n'ont pas le même scope et les variables locales sont aussi détruites en fin de bloc donc en ça, Java a aussi une gestion de la mémoire automatique. Java n'utilise pas de pointeurs mais des références et le new n'empêche pas de disposer d'une mémoire automatique.
Bref, Java a clairement été conçu pour être un dérivé simplifié de C++ et pour corriger certain défauts dont la gestion de la mémoire mais ça n'enlève rien à la qualité du C++ (ça reste un bon langage que j'aprécie beaucoup) et son utilisation massive le prouve mais je pense sincèrement que le jour où les perfs en Java seront équivalente au C++ ce sera la fin du C++.
[^] # Re: SUN annonce Mad Hatter
Posté par bleh . En réponse à la dépêche SUN annonce Mad Hatter. Évalué à 2.
Oui mais dès que tu as besoin d'instancier des classes tu utilises l'opérateur new et donc l'allocation dynamique (oui on peut parfaitement utiliser la pile et non la heap mais la pile n'est pas vraiment faite pour les objets donc on fait rarement de cette façon). On fait de l'objet ne l'oublions pas donc l'objectif est d'utiliser des classes. Dès que tu utilises des objets tu es pratiquement obligé de renoncer à la mémoire automatique et la desallocation se fait à la main. Si j'ai insisté sur les pointeurs intelligents c'est parce que ça montre un besoin de la part des programmeurs d'avoir un système de gestion mémoire automatique (ce que possède Java).
Je ne dis pas qu'il n'y a pas de cas avec vector où il faut utiliser de la mémoire dynamique (avec des pointeurs dans le vecteur par exemple), mais on peut quand même souvent s'en passer
Pour reprendre mon exemple, mes comptes ce sont évidemment des objets (ce n'était peut-être pas très clair) qui contiennent des informations relatives à chaque compte et à chaque nouveau compte récupéré j'instancie mon objet compte que je place dans un vector (de pointeurs à cause des objets que je mets dedans) à des fins d'affichage, dans ce cas on est d'accord j'utilise bien la mémoire dynamique et là si on place des objets compte chèque et compte titre qui sont dérivés de compte on doit effectuer le nettoyage à la main. On pourrait trouver des dizaines d'exemples du même type.
Et en plus la mémoire automatique est plus rapide, et tout se passe bien avec les exceptions...
Oui je suis d'accord mais avec cet exemple là :
Compte *l_compte = new Compte;
l_compte->changerProprietaire(nom);
//d'autres trucs ici
delete l_compte;
Si ma fonction lève une exception je ne passe pas au niveau du delete et mon pointeur n'est jamais libéré.
(Et je ne suis pas d'accord si tu dis que la mémoire automatique c'est laisser au programmeur la gestion de la mémoire. Quand on utilise des pointeurs oui, mais là ce n'est pas le cas)
Loin de moi l'idée de dire que des variables automatiques sont gérées par le programmeurs (quand même ! ;-), pour les pointeurs oui on est d'accord mais là où je ne suis pas d'accord c'est que ce n'est pas aussi simple que ça de ne pas utiliser de pointeurs. Tu inclus d'ailleurs dans ton raisonnement l'utilisation de pointeurs intelligents comme un "best pratice" pour faire du code sûr mais tout ça ce n'est en quelque sorte que du "bricolage" par rapport à ce qui est fait en Java ... c'est un peu comme dire qu'on peut faire de l'objet en C ... oui on peut mais ce n'est pas spécialement pensé pour. C'est la même chose avec le C++.
Si mes souvenirs sont bons, Java ne propose pas de mémoire automatique, on passe toujours par un new ? Si c'est bien le cas, ça me paraît abusif de dire que Java corrige un problème de C++, parce que c'est en partie supprimer quelque chose d'utile et qui ne posait pas de problème. Mais je peux me tromper sur ce point, ou ça a peut-etre été introduit depuis ma dernière utilisation...
Des variables ont des portées de bloc ou de méthode en Java aussi, elle n'ont pas le même scope et les variables locales sont aussi détruites en fin de bloc donc en ça, Java a aussi une gestion de la mémoire automatique. Java n'utilise pas de pointeurs mais des références et le new n'empêche pas de disposer d'une mémoire automatique.
Bref, Java a clairement été conçu pour être un dérivé simplifié de C++ et pour corriger certain défauts dont la gestion de la mémoire mais ça n'enlève rien à la qualité du C++ (ça reste un bon langage que j'aprécie beaucoup) et son utilisation massive le prouve mais je pense sincèrement que le jour où les perfs en Java seront équivalente au C++ ce sera la fin du C++.