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

Langage C++ Discussion :

probleme de segmentation


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut probleme de segmentation
    Bonsoir,

    J'ai un petit probleme avec mon programme: J'ai tout un tas d'erreur de segmentation... je devellope avec Qt, son débugger me dit que ces erreur surviennet lorsque je quitte.

    Je n'avais pas de problème avant de séparer ma classe Mainwindow et ma classe TabDeBord.

    J'ai également un autre probleme, mais peu etre que ces deux sont lié, le constructeur de ma classe ne se lance jamais...
    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
    26
    27
    28
    29
    30
    31
     
    #ifndef TABDEBORD_H
    #define TABDEBORD_H
     
    #include "constante.h"
    #include "tabdebord.h"
    #include "mainwindow.h"
     
     
    class TabDeBord
    {
    public:
        TabDeBord();//constructeur
        ~TabDeBord();//destructeur
     
        double vitesseVise;
        ... plein de variable global ...
        bool clignotant;
     
        void init();
        void PassageVitesse(bool);
        void GestionMoteur();
     
    private:
        float couple;
        ... plein de fonction et variables...
        void CapAiguilleCompteur();
     
    };
     
    #endif // TABDEBORD_H
    JE vous donne deja le header afin de savoir si des erreur flagrantes sont présent je mettrai le reste si besoin.


    Merci d'avance
    Asynchrone.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,

    Comme cela, il nous sera impossible de savoir ce qui se passe!

    Cependant, pour te permettre d'avancer, je peux déjà te dire que, si tu es confronté à une erreur de segmentation, c'est très clairement parce que tu essayes, d'une manière ou d'une autre, d'accéder à une adresse mémoire qui ne contient plus ce qu'elle ést sensée contenir.

    Si l'erreur de segmentation survient au moment de quitter l'application, il y a de très fortes chances pour que le problème se situe au niveau du destructeur d'une de tes classes dans le sens où il invoquerait delete sur un pointeur qui a déjà été détruit.

    Etant donné que tu parles de Qt, il faut savoir que, dés le moment où tu fournis un pointeur vers un objet à un widget, ou à un layout (et à toutes les classes qui en dérivent ou sont basée sur la même logique)-- par exemple au travers des fonctions addWidget, setLayout, addItem et autres -- la mécanique interne du widget ou du layout fait que le widget ou le layout devient le propriétaire légal de l'objet que tu leur donne.

    Du coup, la mécanique interne du widget et du layout fera en sorte d'invoquer automatiquement delete sur tous les éléments que tu leur aura donné.

    Bien qu'il soit impossible de savoir dans quelle situation tu te trouves sans avoir un minimum de code, il est donc possible d'envisager deux situations et de se dire que tu te trouves très certainement dans l'une d'elles :

    Soit tu n'utilises pas l'allocation dynamique pour obtenir un objet que tu transmet (en récupérant l'adresse de l'objet) à un widget ou à un layout, sous une forme proche de
    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
    class MaClasse : public QWidget /* ou n'importe quelle classe dérivée de QWidget*/
    {
        public:
            MaClasse();
            /* ... */
    };
    MaClasse::MaClasse():QWidget(){
        QVBoxLayout layout; // CRACK pas d'allocation dynamique
        /* ... */
        setLayout(&layout); // CRACK MaClasse devient le propriétaire légal
                                    // de layout
    }
     
    int main(){
        MaClass obj;
        /* ... */
        return 0;
    } // BOUM : obj est détruit ici. Le destructeur de QWidget invoque delete
      // sur le pointeur correspondant à layout MAIS layout n'a pas été alloué
      // de manière dynamique --> comportement indéfini -->erreur de segmentation
    Soit tu utilises bien l'allocation dynamique pour tous tes objets, mais tu essayes d'invoquer delete sur les pointeurs en question alors que tu ne devrais pas le faire:
    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
    26
    class MaClasse : public QWidget /* ou n'importe quelle classe dérivée de QWidget*/
    {
        public:
            MaClasse();
            ~MaClasse();
        private:
            QVBoxLayout * tempLayout;
    };
    MaClasse::MaClasse():QWidget(){
        tempLayout = new QVBoxLayout;
        /* ... */
        setLayout(tempLayout);
    }
    MaClass:: ~MaClass(){
        delete tempLayout; //CRACK
    }
    int main(){
        MaClass obj;
        /* ... */
        return 0;
    } // BOUM : obj est détruit ici. 
     // Le destructeur de MaClasse est appelé, delete est invoqué sur tempLayout 
      // le destructeur de QWidget est appelé ensuite, mais il invoque delete
      // sur le pointeur qui correspond (en interne) à tempLayout
      // ==> tentative de libérer deux fois la mémoire allouée à tempLayout
      // --> comportement indéfini --> erreur de segmentation
    Bien sur, j'ai pris le cas tout simple ici, mais c'est parfois un peu plus retors que cela
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Invité
    Invité(e)
    Par défaut
    Dans le destructeur vous devez désallouer (delete) les objet fils (child) avant les objets parent (parent). Si vous faite le contraire vous aurez un erreur de segmentation !

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Citation Envoyé par issam.abdallah Voir le message
    Dans le destructeur vous devez désallouer (delete) les objet fils (child) avant les objets parent (parent). Si vous faite le contraire vous aurez un erreur de segmentation !
    1- Généralement, c'est le destructeur du parent qui devrait se charger d'invoquer delete sur les enfants

    2- si tu avais pris la peine de lire un tout petit peu le message de asynchrone ainsi que le mien, tu aurais remarqué qu'il travaille avec Qt et que la logique de fonctionnement de la majeure partie des éléments de Qt est de prendre elle-même en charge les éléments enfants.

    Il ne faut donc en aucun cas invoquer toi-même delete sur un pointeur qui aurait été transmis à une classe issue de la hiérarchie Qt
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    merci beaucoup pour ces réponse, elle ne corrige pas (pour le moment) mon problème mais j'ai de très bonne piste =)


    Il se trouve qu'en effet je ne fait aucun allocation dynamique pour mes objet, je vais donc faire des recherches sur cette piste, je vous tien au courant des que j'ai trouvé ou que je bute a nouveau sur ce "bug"

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup mon problème est résolu


    en effet je ne faisait pas d'allocation dynamique de mon objet,

    un simple NomDeMonObjet = new MaClasse, au constructeur

    suivit du delete(NomDeMonObjet) dans le destructeur a réglé l'affaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Socket] Probleme de segment TCP
    Par zwoke dans le forum C#
    Réponses: 2
    Dernier message: 05/04/2007, 11h09
  2. probleme de segment de memoire partagé
    Par charisma dans le forum C
    Réponses: 1
    Dernier message: 09/01/2007, 11h08
  3. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 02h12
  4. probleme de segmentation
    Par lorie75 dans le forum C
    Réponses: 15
    Dernier message: 10/07/2006, 21h31
  5. Gros probleme de segmentation
    Par Treuze dans le forum C++
    Réponses: 10
    Dernier message: 10/04/2006, 12h10

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