auto_ptr quand et comment l'utiliser ?

auto_ptr quand et comment l'utiliser ? - C++ - Programmation

Marsh Posté le 02-09-2005 à 12:38:59    

Pour ceux qui ne connaissent pas auto_ptr:
http://www.gotw.ca/publications/us [...] tively.htm
 
Je me pose la question toute bete, dans quel cas est-il encore necessaire d'utiliser le classique new plutot que auto_ptr ? A quel moment ne faut-il pas utiliser auto_ptr ? quels sont les cas ou auto_ptr ne doit pas etre utilise ?
 
voili voilou

Reply

Marsh Posté le 02-09-2005 à 12:38:59   

Reply

Marsh Posté le 02-09-2005 à 12:57:53    

ou autrement, comment l'utiliser

Code :
  1. {
  2. auto_ptr<X> px(new X);
  3. //
  4. px->z();
  5. }


 
et c'est grosso modo tout ce que tu peux faire avec. Le design de auto_ptr<> ne suit pas la règle de "The Least Surprise"
 

Code :
  1. auto_ptr<X> a, b;
  2. a = new X;
  3. b = a;
  4. a->z(); // boom !


 
utilise boost::shared_ptr<>

Reply

Marsh Posté le 02-09-2005 à 14:32:55    

C'est incompatible avec les tableaux aussi.
http://c.developpez.com/faq/cpp/?p [...] RS_autoptr


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-09-2005 à 14:40:45    

Très pratique pour la gestion de ressources qui doivent être rendues (pour faire une classe fichier, port, etc).


Message édité par el muchacho le 02-09-2005 à 14:41:58
Reply

Marsh Posté le 02-09-2005 à 15:08:03    

Je viens de capter.
auto_ptr libere la memoire des que l'on sort du "scope"
A un moment je pensais qu'il y avait un compteur de references et donc que ca s'utilisait comme les references en Java.
 
bref si c'est juste pour remplacer:
 
{
new ...
...
delete
}
 
par
{
auto_ptr<...
...
}
 
Je ne vois presque aucun interet en fait, je comprends pourquoi personne n'utilise ca.

Reply

Marsh Posté le 02-09-2005 à 16:29:23    

l'effet c'est que si t'as une exception qui part ou un return / break / continue dans ton block, t'évites une fuite

Reply

Marsh Posté le 02-09-2005 à 16:47:03    

Citation :

auto_ptr libere la memoire des que l'on sort du "scope"


C'est le principe du RAII. C'est beau, c'est fiable, c'est propre.

Citation :

A un moment je pensais qu'il y avait un compteur de references et donc que ca s'utilisait comme les references en Java.
[...]
Je ne vois presque aucun interet en fait, je comprends pourquoi personne n'utilise ca.


auto_ptr ne fait pas du comptage de référence (shared_ptr oui), mais possède une sémantique de déplacement. Ca peut induire en erreur, mais dans les cas où ça convient, c'est sans surcoût (car le compteur faut le stocker quelque part...), et donc pas si mal. Il a donc son utilité.
Car écrire du code qui ne leak pas est beaucoup plus dur qu'il n'y parrait. Comme l'a dit Taz, ton code n'est pas exception safe. Pour qu'il le soit:

Code :
  1. A * a = new A;
  2. try
  3. {
  4.      // ...
  5. }
  6. catch ( ... )
  7. {
  8.     delete a;
  9.     throw;
  10. }
  11. delete a;


auto_ptr transfome tout celà en une seule ligne.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-09-2005 à 17:34:52    

mais exception ou pas, c'est du RAII. quelque soit le chemin de ton code, tu as l'assurance que ton objet/ressource sera détruite.

Reply

Marsh Posté le 02-09-2005 à 20:10:53    

Au passage, RAII = "Resource Acquisition Is Initialization"
 
http://gethelp.devx.com/techtips/c [...] in1101.asp
 
http://www.devx.com/cplus/10Minute [...] 7/0/page/1
 
http://gethelp.devx.com/techtips/c [...] in1199.asp


Message édité par el muchacho le 02-09-2005 à 20:15:24
Reply

Marsh Posté le 05-09-2005 à 14:44:57    

et ben merci bien pour toutes ces infos. Ca me fait de la lecture en perspective

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed