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++

Vue hybride

ValyGator Erreur de segmentation avec... 11/02/2009, 18h04
white_tentacle Alloué avec new[], tu dois le... 11/02/2009, 18h10
Arzar delete[] M; 11/02/2009, 18h13
poukill C'est combien "pas mal de... 11/02/2009, 18h21
ValyGator 4 ans, et je ne suis jamais... 11/02/2009, 18h30
white_tentacle à la place du carré, il y a... 11/02/2009, 18h33
Goten Le compilateur ne peut pas... 11/02/2009, 18h40
Goten un new[] sans son delete[]... 11/02/2009, 18h24
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    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 Expert
    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
    Par défaut
    Alloué avec new[], tu dois le libérer avec delete[]

  3. #3
    Membre Expert

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

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

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

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    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é?

  6. #6
    Membre Expert
    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
    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.

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

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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 ).

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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...

+ 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