IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Plantage lors de la destruction d'une classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Points : 20
    Points
    20
    Par défaut Plantage lors de la destruction d'une classe
    Je suis en train de créer un jeu; j'utilise les gamestate, et j'ai créer un objet CMenuMrincipal, mais le problème c'est que lors de la destruction de celle-ci, le programme plante! J'ai aussi quelques problème lors de la destruction des classes CEdit et CBouton (cf.code), c'est pareil le programme plante (je crée des pointeurs de pointeurs que j'alloue 2fois de suite : une fois pour creer un tableau et une fois pour chaque objet). je vous ai mis les fichiers attaché necessaires (si il manque quelque bout de code dite le moi)
    Encore une chose : est-ce que je ne fais pas trop d'allocation dynamique ?

    Voila, j'attend vos réponses.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Normal, tu fais free(Bouton[i]);...

    Faudrait un peu apprendre à coder en C++, c'est quoi ce C partout ?

    En C++ on utilise new et delete, surtout pour les objets.
    Et puis même, l'allocation dynamique on évite.

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par xwindoo
    Je suis en train de créer un jeu; j'utilise les gamestate, et j'ai créer un objet CMenuMrincipal, mais le problème c'est que lors de la destruction de celle-ci, le programme plante! J'ai aussi quelques problème lors de la destruction des classes CEdit et CBouton (cf.code), c'est pareil le programme plante (je crée des pointeurs de pointeurs que j'alloue 2fois de suite : une fois pour creer un tableau et une fois pour chaque objet). je vous ai mis les fichiers attaché necessaires (si il manque quelque bout de code dite le moi)
    Encore une chose : est-ce que je ne fais pas trop d'allocation dynamique ?

    Voila, j'attend vos réponses.
    Si te serrais possible de cibler un peu le problème, en plus de nous simplifier la tache (après une journée à coder, on a pas forcement envie de comprendre 42Ko de texte ) et en ça peut te permettre de trouver le problème.

    A part ça c'est sûr que les allocations dynamiques à la pelle c'est une source de problème, pourquoi ne pas utiliser les vecteurs ?

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Smartpointer sinon !

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Points : 20
    Points
    20
    Par défaut
    Excusé moi, je n'ai pas précisé ou se trouvait excactement le problème :
    C'est dans le fichier State.cpp dans la fonction ChangeState()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(m_pActualState)
    {
    	m_pActualState->Release();
    	delete m_pActualState; // <- c'est a cette ligne que le programme plante
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_pActualState = new CMenuPrincipal(hWnd, this, m_pDirect3D, m_pDirectMusic, m_pSocket, m_pDirectInput); //<- voila la création de m_pActualState

    Désolé d'avoir mélangé le c et le c++ je modifierai ca et je vous redit si sa ne plante pas.

    ti-R -> c'est quoi un smartpointer ?

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Je ne sais pas si ça peut venir de là, mais je n'ai pas vu de destructeur virtuel pour CGameState.

    Citation Envoyé par xwindoo
    ti-R -> c'est quoi un smartpointer ?
    C'est un pointeur "intelligent". Ca sert à éviter les problèmes de pointeurs invalides...
    Voir le tuto de Miles :
    http://miles.developpez.com/tutoriel...ost/smartptrs/

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Les smart pointers permettent de gérer plus facilement les allocations dynamiques (en gros). Ceux de boost sont très bien mais tu peux aussi commencer par utiliser le std::auto_ptr<X> présent dans le header <memory>. C'est une classe que tu initialises en lui passant un pointeur vers un objet et qui va détruire cet objet à sa propre destruction.
    Sinon, dans ce cas ci je ne vois pas de meilleure solution que tu apprenes à en utiliser. Ton code contient trop d'allocations dynamiques pour qu'on puisse te filer un coup de main, l'erreur peut très bien se trouver à 100 lieues de la ou tu penses.

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Points : 20
    Points
    20
    Par défaut
    gege2061 -> qu'entend tu par 'vecteur' ?
    zais_ethael -> il faudrai que je ne fasse presque pas d'allocatoins dynamqiues; que CMenuPrincipal, CMTDirect3D, etc serai en dynamique et tout le reste (bouton, edit, etc) en statique; et cela éviterai peut-etre pas mal de problème de destruction de la classe CMenuPrincipal ?

    Sinon pour les testes je ne pourrai que les faire vendredi

  9. #9
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par xwindoo
    gege2061 -> qu'entend tu par 'vecteur' ?
    Regarde du côté de la FAQ...
    http://c.developpez.com/faq/cpp/?page=STL

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Points : 20
    Points
    20
    Par défaut
    J'ai fais quelques testes: le destructeur de CGameState ne change rien au problème. Après un nouveau debugage, le problème c'est ciblé sur les fonction Draw() des bouton et edit; donc je pense que ces fonctions sont appelées après la destruction des objets. Je vais par conséquent supprimer toutes les allocations dynamique de ces classes et dans un premier temps les remplacer par un tableau. Je vous redit les résultats dès que j'ai fini.

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 62
    Points : 20
    Points
    20
    Par défaut
    Désolé pour ce retard.
    J'ai tout remplacer les edit et bouton dynamiques en statiques.
    Je comprend toujours rien : maintenant, le programme plante a la fonction texte() de CMTDirect3D appelé dans la fonction Draw des edit et bouton (j'ai joins les nouveaux fichiers) plus précisément à la fonction DrawText() de l'interface ID3DXFont.
    Voila, je commence a désèspérer, je sais vraiment plus quoi faire.

    PS: je peu vous donner tous les fichiers du projet si vous voulez tester.

Discussions similaires

  1. [WPF] Plantage lors de la création d'une instance de classe
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 14/09/2007, 14h31
  2. Réponses: 4
    Dernier message: 23/04/2006, 10h36
  3. Réponses: 3
    Dernier message: 09/04/2006, 13h04
  4. [vb.net] erreur lors de l'éxécution d'une classe
    Par os_rasta dans le forum VB.NET
    Réponses: 10
    Dernier message: 01/12/2005, 18h34
  5. destruction d'une classe qui herite de CDialog
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2004, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo