Bonjour,
J'ai un doute sur ce que fait exactement un bout de code que j'ai écrit pour l'école, en fait je crains que toute la mémoire allouée pour mon arbre binaire ne soit pas complètement libérée :
Est-ce que de cette manière, la mémoire allouée est bien complètement libérée lors de l'appel du destructeur?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class Dictionnaire { private: char *mot; Dictionnaire *gauche; Dictionnaire *droite; void effacer(); public: ~Destructeur(); /* et d'autres choses ici bien entendu */ } void Dictionnaire::effacer() { delete[] mot; if (gauche) gauche->effacer(); if (droite) droite->effacer(); } Dictionnaire::~Dictionnaire() { effacer(); }
J'ai un doute en fait, j'ai peur que seule la mémoire allouée pour mot[] soit libérée, et peut-être pas la mémoire de tous les *gauche et *droite.
J'aurais pu directement faire un destructeur récursif, mais j'ai également une fonction reinitialiser() qui doit aussi libérer la mémoire (et donc faire appel à effacer()).
Autre question, n'y a-t-il pas de problème avec le C++ et la récursivité si la récursion va trop loin? Je pense qu'au niveau performance il vaut mieux concevoir un algorithme itératif (je pense que fonction récursive = un CALL à chaque appel, mais peut-être que le compilateur arrive à éviter ça), et je crois avoir déjà entendu parler d'histoires de "dépassement de pile" si ça va trop profondément.
Merci!
Partager