[gull] cours C++

Marc Mongenet marc.mongenet at gmail.com
Sat Feb 25 13:49:06 CET 2006


Le 24/02/06, Daniel Cordey<dc at mjt.ch> a écrit :
> Pendant qu'on y-est... abordons justement le probleme de malloc() et de C++.
> Il est fort regrettable que C++ n'ait pas une gestion "propre" de la memoire
> dynamique. C++ fait massivement appel a malloc() et il suffit qu'un
> utilisateur commette une erreur dans sa propre utilisation de malloc pour que
> le debugging devienne un enfer... (j'ai encore en memoire mon premier 'bus
> error' pointant sur une ligne ne contenant qu'une parenthese). Idealement,
> C++ aurait du offrir une gestion "separee" de la memoire dymanique, afin
> aussi de garantir la "destruction" d'objet alloues dynamiquement lors de
> l'instantiation d'un objet... ou de son extension dans le courant de sa vie.
> Au lieu de cela, C++ s'en lave les mains et laisse l'utilisateur utiliser ce
> qu'il veut... CAD malloc(). Ceci mene systematiquement a des "memory leaks"
> et les exemples sur le net sont plus que nombreux. Il etait pourtant facile
> de n'offrir ne fut-ce qu'une librairie/class offrant ce genre de service...
> Tout les autres langages OO offrent ce genre d'outils au travers de
> "ramasse-miette", plus ou moins bien faits, mais quand meme existants; C++
> etant le seul a regarder les mouches au plafond... Bien sur, on retroquera
> que C++ est un langage et pas une collection de librairies/classes, mais que
> serait le C sans printf() et malloc() ? Pour moi, cela faisait partie du
> minimum a assurer.

En fait si, C++ est un langage plus une bibliothèque standard d'une
taille certaine (décrite en 780 pages dans le livre de Josuttis).
En fait c'est un runtime obligatoire de taille non négligeable
(comme un ramasse-miettes) que les concepteurs de C++ ont
voulu éviter, mais pas une grosse bibliothèque.

Pour la gestion de la mémoire, la bibliothèque standard propose
notamment le type std::auto_ptr:

#include <memory>
void f() {
  std::auto_ptr<int> p (new int);
  *p = 123;
  // pas besoin d'appeler delete p
}

Le type std::auto_ptr ne sert qu'à gérer les pointeurs, mais il est basé
sur un style de programmation (resource acquisition is initialization)
qui a l'avantage d'être utilisable pour toutes les ressources (allocation
mémoire, mais aussi fichiers ouverts, verrous, connexions, etc.) et d'être
fiable même en présence d'exceptions. Le principe de base, c'est que le
destructeur libère la ressource. Donc dès qu'on sort du bloc où p est
défini, qu'on sorte par la fin, par un return ou par une exception, alors le
destructeur de p est appelé et se charge de libérer la mémoire.

Marc Mongenet



More information about the gull mailing list