Envoyé par
souki22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int main(int argc, const char * argv[])
{
// racine
arbre<int> * racine=new arbre<int>(100);
// fils de racine
racine->enfile(new arbre<int>(80)); //noeud 0
racine->enfile(new Tree<int>(2));
// fils du noeud 0
(racine->renvoieFils(0))->enfile(new arbre<int>(4)); // noeud 1
// fils du noeud 1
((racine->renvoieFils(1))->renvoieFils(0))->enfile(new arbre<int>(105));
std::cout<<std::endl;
racine->display();
std::cout<<std::endl;
std::cout<<root->minProfondeur()<<std::endl<<root->maxProfondeur();
return 0;
} |
Euhh, sinon, j'avoue, je n'ai pas très bien compris ta phrase koala01 qui sans doute pointe sur ce que je ne sais pas dans mon code
De manière générale si tu n'obtient pas l'affichage auquel tu t'attends lors du passage dans le destructeur, c'est sans doute parce que tu as eu recours à l'allocation dynamique de la mémoire pour un pointeur sur lequel tu n'as simplement jamais appelé delete
Sinon, j'ai bel et bien essayé de mettre des points d'arrêt dans mon destructeur, il n'est tout simplement jamais atteint, le programme se termine (proprement) sans que je rentre dans le mode debug !
Ben, justement, le code de ta fonctions main nous montre que tu as utilisé l'allocation dynamique pour créer l'ensemble des noeuds de ton arbre, y compris pour ta variable racine, vu que tu as écrit
arbre<int> * racine=new arbre<int>(100);
Ce faisant, tu as décidé de prendre la responsabilité du moment où il faudra libérer les ressources allouées à cette variable (et donc, les noeud enfants par l'intermédiaire du destructeur), mais... tu n'indique jamais qu'il est temps de détruire cette variable. Il n'y a donc rien de surprenant au fait que le destructeur ne soit jamais appelé. (note au passage que, si tu n'étais pas dans la fonction main, tu aurais une belle fuite mémoire!!! Une chance que le système d'exploitation est là pour récupérer ton erreur ).
C++ n'est pas comme java ou comme C#!!! Nous ne pouvons pas nous reposer sur un garbage collector pour libérer les ressources devenues inutiles . La règle (si on décide de ne pas utiliser les pointeurs intelligents) est qu'il faut pouvoir associer un delete à chaque new. On peut associer le delete qui se trouve dans le destructeur à l'ensemble des new qui te permettent de créer les différents noeuds enfants, mais il reste le new qui te permet de créer la variable racine qui n'est associé à aucun delete, et tous tes problèmes découlent de là
Rajoute simplement la ligne juste avant le return 0; final, et tout rentrera dans l'ordre
Partager