Problème Destructeur classe System

Problème Destructeur classe System

par Florian Xavier Käslin,
Number of replies: 1

Bonjour,

Mon problème est le suivant:

Afin de tester ma classe Systeme et les fonctionnalités liées aux classes Dessinable et SupportADessin, j'ai une main() dans un fichier Test_Dessin.cc. J'arrive à créer un Systeme, y ajouter des toupies ainsi qu'attribuer un SupportADessin à mon Systeme et au toupies qui le composent. Les différente fonctionnalités fonctionnent bien à priori. Le problème survient à la fin de l’exécution du programme. en effet, j'ai un message d'erreur d'erreur et le programme ne se termine pas correctement. Après quelques essais, je pense que le problème se situe au moment de détruire le Systeme.

Pour clarifier un peu la situation, mon programme se structure comme suit:

[SUPPRIMÉ]

Le déroulement de mon programme de test est assez simple. je crée un Systeme et lui attribue un SupportADessin, j'y met une ou des toupies, je test la fonction dessine() qui doit afficher le Systeme avec ses Toupie. Cette partie là fonctionne sans souci à première vue. Mais quand le programme devrait se terminer, j'ai ce genre de message dans mon invite de commande:
"   
      ------------------
     (program exited with code: -1073741819)

"

J'ai pu isolé trois types de déroulement différents:

1) J'initialise un Systeme en lui attribuant un SupportADessin, mais en ne lui ajoutant aucune Toupie. Dans ce cas, le programme se termine sans erreur

2) Pareil mais en ajoutant une Toupies et en affichant le Systeme. Le résultat est le suivant:


3) Pareil qu'avant mais avec 2 ou plus Toupie (ici 3):

Je précise que j'ai modifier les destructeurs de toutes ces classes afin qu'ils affiche le nom de la classe au moment ou ils sont applé. Ici on peut voir que le destructeur de Systeme est appelé, puis de ConeSimple qui appelle celui de Toupie etc... Je précise que le nombre qui Toupie qui sont visiblement détruite (ou l'on peut l'observer sur l'affichage) lors de l'appelle du destructeur de Systeme reste le même pour des systeme de deux ou plus toupies.

Voilà les informations que j'ai pu avoir. Je me doute qu'il doit y avoir un problème avec les pointeurs, mais je ne sais vraiment pas où. D'autant que j'ai tester d'initialiser un tableau dynamique de unique_ptr<Toupie> manuellement dans ma main() de test, et dans ce cas, le tableau se détruit sans problème. 

Merci d'avance !

Florian Käslin

(Modifié par Jean-Cédric Chappelier : PAS DE FUITE DE CONCEPTION NI DE CODE SUR LE PROJET !!!)

In reply to Florian Xavier Käslin

Re: Problème Destructeur classe System

par Jean-Cédric Chappelier,

pour déboguer un programme. il est bon de compiler avec l'option -g et aussi tous les warning, en tout cas -pedantic -Wall. Est-ce que vous le faites ?
(ceci dit, dans votre cas, je ne pense pas que cela vous donnera la source de l'erreur ; mais commençons par une base simple).

Ensuite : êtes vous au clair sur la gestion de votre mémoire : est-ce que vous faites des new ? des delete ? (normalement non puisque vous utilisez les smart pointers)
Et pourquoi utiliser des shared_ptr ?? (non présentés en cours pour de bonne raisons) un unique_ptr ne serait pas suffisant ? un « pointeur à la C » ?

Enfin, si vraiment vous ne trouvez pas, valgrind ou ASan (-fsanitize=address) peuvent être de bons outils :
  1. dans le terminal, lancez
    valgrind monprogramme
    p.ex.
    valgrind test-toupie
    Bien sûr il faut avoir installé valgrind (https://valgrind.org/) ou alors aller sur les VM de l'Ecole
  2. compilez en ajoutant l'option -fsanitize=address ; mais il faut avoir installé ASan (https://github.com/google/sanitizers/wiki/AddressSanitizer) ou alors aller sur les VM de l'Ecole
  3. ne faites pas les 2 en même temps !!