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
singleDeletegénérique paramétrée par un typeT, qui prend en argument un pointeur surTet libère l’objet (simple) pointé par celui-ci; le type de retour estvoid. - Écrire une fonction
arrayDeletede même signature qui libère le tableau pointé par l’objet passé par en argument. - Modifier la classe
SmartPointerde 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 aurasingleDeletecomme 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
SingleDeleteetArrayDeletequi contiennent des méthodes statiquesdelete. - Modifier le code de
SmartPointerde sorte que le second paramètre template est maintenant un typeDeletorqui 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]);