Bonsoir,
Cela fait plusieurs jours que je réfléchis à la façon de coder un système de pointeurs intelligents "maisons", et j'ai enfin fini par l'implémenter. Ce système est très simple, il est de la forme suivante :
Avec Object = la classe mère de ma bibliothèque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 template <typename T> class Pointer { private: Object *o; public: inline Pointer(T* obj) : o(obj) {} // ... }; // Utilisation : Pointer<Object> obj = new Object();
Comme tout système de pointeurs intelligents qui se respecte, le mien dispose d'une fonction "IsNull()" qui renvoie true si le pointeur "o" est égal à NULL.
Le problème : faire un système de pointeurs intelligents pour gérer les pointeurs nuls signifie généralement sortir un bazooka pour tuer une mouche. Ce que je cherche à faire est, à partir de l'adresse du pointeur o, de savoir s'il a été ou non été désalloué par delete.
Le soucis, logique, est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part inline bool IsNull() const { return (!o || *&o == NULL); }
Après le delete, le pointeur a juste été désalloué, et *&pointeur ne retourne pas NULL mais une valeur belle et bien réelle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Classe *pointeur = new Classe(); delete pointeur;
Ainsi, ce que je cherche à faire est de savoir si le pointeur a ou non été désalloué en se servant de la mémoire. Bien sûr, je vois déjà des réponses du type "pourquoi ne fais-tu pas pointeur = NULL; après le delete ?", ou bien "pourquoi ne pas utiliser les exceptions ?".
La première solution n'est pas envisageable car ma bibliothèque est déjà bien avancée, et il n'est pas envisageable d'y placer NULL partout où il y a lieu de delete. La seconde n'est pas non plus envisageable car la classe sera très souvent instanciée et utilisée dans le code (pour ne pas dire, toutes les 2 sec 1/4).
L'unique solution que j'ai trouvée est une solution qui fonction par pointeur sur pointeur. Toutefois, je ne vois pas tellement comment implémenter quelque chose qui tienne la route et qui retourne true si le pointeur a été désalloué et false si le pointeur ne l'a pas été. J'en suis là, mais ça ne fonctionne pas :
Je m'excuse de vous déranger pour ce type de problème, mais de l'aide serait vraiment la bienvenue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // Ne faites pas attention à la fuite de mémoire... inline bool IsNull() const { if (!o) return true; Object *object = o; Object **objectP = &object; if (*objectP == NULL) return true; return false; }
Merci d'avance à tous ceux qui pourront m'aider,
Amnell.
Partager