Vous comprendrez...
... qu’il faut être méfiant avec la mémoire, car le C++ est truffé d’allocations et désallocations implicites. On vous proposera ici de vous restreindre à un usage de la mémoire "à la java", reservant un usage plus avancé au cours de C++.
Exercices
Préliminaire
Copier les fichiers Truc.h et Truc.cc dans le dossier de travail que vous utiliserez pour ce TP. Vous n’avez pas à comprendre son contenu. Il définit un type Truc, qui trace à l’écran ce qui lui arrive en mémoire.
Exécutez ce code et voyez ce qu’il se passe.
Pour rappel, il faut faire
g++ -c Truc.cc
puis pour votre fichier main
g++ -c Main.cc
g++ -o prog Main.o Truc.o
./prog
Dans la sortie écran, on voit les allocations de mémoire (une seule ici, dont le numéro est 0), et les désallocations. L’ensemble des objets trucs en cours est représenté par la liste des numéros de ces objets, entre accolades... cet ensemble doit être vide en fin de main !
Essayez ceci pour comparer...
L’ensemble vide n’apparaît pas ! Alors que si vous décommentez le delete.... Essayez.
Essayez celui-ci, et corrigez-le pour qu’il ne reste pas d’instance de Truc non libérée à la fin ({} doit apparaître).
Exercice sur l’appel de fonction
Essayez ces deux programmes, que constatez-vous ?
Le second est exactement le comportement de java pour le passage de paramètres.
Essayez celui-ci, en notant l’usage de l’opérateur &...
Exercice sur l’allocation dans le tas (new)
Observez le comportement de ce code
Modifiez ce programme pour que toutes les instances de Truc soient dans le tas, i.e soient allouées explicitement avec un new.
Construisez vos propres classes
Dans ce TL, l’idée est de se ramener, en C++, au fonctionnement de java (on alloue toutes les instances avec des new). Il ne faut pas en rester là dans la pratique du C++, mais ce point est hors du propos du présent TP.
Téléchargez Machin.h, Machin.cc, Main.cc, et lisez-les dans cet ordre.
Exécutez Main.cc. Il y a des fuites de mémoires.... Et une gestion assez peu rationnelle des pointeurs. Modifiez l’ensemble de ce code pour que la gestion des pointeurs soit claire pour l’utilisateur de la classe Machin, et implémentez un destructeur cohérent avec la gestion que vous aurez choisie.