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 :

Erreur de segmentation avec delete


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Erreur de segmentation avec delete
    Bonjour,
    Je programme en C++ depuis pas mal de temps, mais je tombe sur un problème que je n'avais encore jamais vu. Pour être concret voici mon programme (cette version est inutile, mais elle est là uniquement pour reproduire l'erreur):
    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
    32
    33
     
    using namespace std;
     
    #include <iostream>
     
    class Test
      {
        double *Vecteur;
     
        public:
          Test(void)
            {
              cout << "Construction et initialisation de Vecteur." << endl;
              Vecteur=new double[100];
     
              for (int i=0;i<100;i++)
                Vecteur[i]=0.0;
            }
     
          ~Test(void)
            {
              cout << "Destruction de Vecteur." << endl;
              delete Vecteur;
            }
      };
     
    int main(void)
      {
        Test *M;
        M=new Test[4];
    //    delete M;
        return 0;
      }
    J'ai donc ici une classe Test, avec un constructeur qui alloue un tableau de 100 doubles. Le destructeur prend soin de libérer ce tableau lors de la destruction de l'objet.

    La fonction main quant à elle alloue un tableau de 4 objets Test. Lors de l'exécution, tout se passe comme prévu, on peut vérifier que le programme affiche 4 fois de suites la phrase "Construction et initialisation de Vecteur". Le problème survient lorsque je décommente la ligne "delete M" qui est cencée libérer le tableau de 4 objets. Le programme affiche une fois la phrase "Destruction de Vecteur", donc le destructeur est bien appelé lors de la libération du premier object. Mais le programme s'arrête là avec une erreur de segmentation.

    Quelqu'un en connait-il la raison? Comment puis-je libérer mon tableau d'objets? Notez que mon programme est en fait beaucoup plus compliqué et que des tas d'opérations sont effectuées sur ce tableau d'objet sans problème. C'est uniquement lorsque je veux quitter proprement que ça plante.

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Alloué avec new[], tu dois le libérer avec delete[]

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    delete[] M;

  4. #4
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    [joke]
    C'est combien "pas mal de temps" ?
    [/joke]

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    un new[] sans son delete[] ...



    edit : c'est ça d'ouvrir un onglet et de répondre 5 minutes plus tard sans actualiser...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par poukill Voir le message
    [joke]
    C'est combien "pas mal de temps" ?
    [/joke]
    4 ans, et je ne suis jamais tombé sur ce problème... Surtout qu'aucune erreur ne survient quand je compile et exécute le programme sous Windows. C'est uniquement sous Linux que j'ai l'erreur de segmentation.

    Par contre je ne parvient pas à lire vos réponses (Mon navigateur n'afficherait-il pas tous les caractères?). Je vois comme réponse:

    delete 'un carré' M

    Qu'y a-t-il à la place du carré?

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    à la place du carré, il y a []

    c'est à dire, un crochet ouvrant [ et un crochet fermant ].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * a = new char[2];
    delete a;
    est un comportement indéfini. Donc il a le droit de faire seg fault.

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par ValyGator Voir le message
    4 ans, et je ne suis jamais tombé sur ce problème... Surtout qu'aucune erreur ne survient quand je compile et exécute le programme sous Windows. C'est uniquement sous Linux que j'ai l'erreur de segmentation.

    Par contre je ne parvient pas à lire vos réponses (Mon navigateur n'afficherait-il pas tous les caractères?). Je vois comme réponse:

    delete 'un carré' M

    Qu'y a-t-il à la place du carré?
    Le compilateur ne peut pas savoir que le new associé à ton delete est un new[]...

    L'erreur que tu fais provoque un comportement indéterminé, ça plante pas sous windows pour l'instant, mais ça plantera un jour. (suivant la loi de murphy, ça plantera l'or d'une première démonstration ).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Effectivement ça marche. Merci à tous!

  10. #10
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    De rien, de rien...
    Au passage, voir des new et des delete ça me fait penser à un truc : utilises tu des pointeurs intelligents? RAII ?

  11. #11
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par poukill Voir le message
    De rien, de rien...
    Au passage, voir des new et des delete ça me fait penser à un truc : utilises tu des pointeurs intelligents? RAII ?
    Désolé, j'ignore ce que sont les pointeurs intelligents... Donc on va dire que j'utilise des pointeurs bêtes (ou plus précisément que j'utilise bêtement des pointeurs).

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Hum... je m'en doutais un peu. Mais ce n'est pas grave du tout. On est tous là pour apprendre.
    Je t'encourage donc à lire ce document sur les smart_pointer.
    C'est très important pour écrire des programmes robustes.

    Bonne continuation,

    Poukill

  13. #13
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par poukill Voir le message
    Hum... je m'en doutais un peu. Mais ce n'est pas grave du tout. On est tous là pour apprendre.
    Je t'encourage donc à lire ce document sur les smart_pointer.
    C'est très important pour écrire des programmes robustes.

    Bonne continuation,

    Poukill
    Merci à toi!

  14. #14
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pour appuyer la réponse de poukill, j'ajouterais que les pointeurs intelligents / le RAII sont des principes/techniques qui appartiennent à ce que l'on appelle "C++ moderne". Cela consiste à écrire des programmes robustes, à l'opposé du C où l'on gère la mémoire à l'ancienne, afin de se concentrer sur ce que l'on veut que son code fasse, mais aussi modulaires et, si c'est une bibliothèque, générique, notamment.

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

Discussions similaires

  1. erreur de segmentation avec pyopengl et glut
    Par bourriquet_42 dans le forum OpenGL
    Réponses: 3
    Dernier message: 01/03/2009, 13h35
  2. Erreur de segmentation avec fclose
    Par sylvanus35 dans le forum Débuter
    Réponses: 7
    Dernier message: 09/08/2008, 05h33
  3. Erreur de segmentation avec libxml2
    Par DevMg dans le forum XML
    Réponses: 0
    Dernier message: 18/02/2008, 14h44
  4. Erreur de segmentation avec RSA_verify
    Par LorDjidane dans le forum C
    Réponses: 7
    Dernier message: 14/06/2007, 11h29
  5. Erreur de segmentation avec un main vide
    Par matique dans le forum Réseau
    Réponses: 10
    Dernier message: 22/04/2007, 07h07

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