Désallocation paramétrée.

On veut utiliser les SmartPointer pour implémenter les CharSequence. Le problème est que dans la version actuelle, un SmartPointer peut encapsuler un objet simple (libéré par delete), mais pas un tableau ou une chaîne de caractères (qui devrait être libérée par delete[]).

  1. Écrire une fonction singleDelete générique paramétrée par un type T, qui prend en argument un pointeur sur T et libère l’objet (simple) pointé par celui-ci; le type de retour est void.
  2. Écrire une fonction arrayDelete de même signature qui libère le tableau pointé par l’objet passé par en argument.
  3. Modifier la classe SmartPointer de sorte qu’elle prenne en deuxième paramètre template un pointeur sur une fonction du type de celle décrite en 1 ou 2; ce second paramètre aura singleDelete comme valeur par défaut.
    Utiliser ce pointeur de fonction pour libérer le pointeur confié à SmartPointer. Vérifier avec valgrind le code ci-dessous:
   using namespace enseirb; 
   SmartPointer<int> p(new int(5));
   SmartPointer<int,arrayDelete<int> > q(new int[5]);

En cas d’ennui en fin de TP (faire d’abord la suite !)

  1. Remplacer chacune des fonctions écrites en 1. et 2. par des classes paramétrées SingleDelete et ArrayDelete qui contiennent des méthodes statiques delete.
  2. Modifier le code de SmartPointer de sorte que le second paramètre template est maintenant un type Deletor qui vaut par défaut SingleDelete<DataType>.
  3. Modifier la déclaration des paramètres template de sorte que le second paramètre n’est plus un type, mais une classe paramètrée incomplète. On pourra alors écrire
   using namespace enseirb; 
   SmartPointer<int> p(new int(5));
   SmartPointer<int,ArrayDelete> q(new int[5]);