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[]
).
- Écrire une fonction
singleDelete
générique paramétrée par un typeT
, qui prend en argument un pointeur surT
et libère l’objet (simple) pointé par celui-ci; le type de retour estvoid
. - Écrire une fonction
arrayDelete
de même signature qui libère le tableau pointé par l’objet passé par en argument. - 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 aurasingleDelete
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 !)
- Remplacer chacune des fonctions écrites en 1. et 2. par des classes paramétrées
SingleDelete
etArrayDelete
qui contiennent des méthodes statiquesdelete
. - Modifier le code de
SmartPointer
de sorte que le second paramètre template est maintenant un typeDeletor
qui vaut par défautSingleDelete<DataType>
. - 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]);