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 :

Crash inexplicable lors de l'appel de "delete"


Sujet :

C++

  1. #1
    Membre du Club

    Inscrit en
    Décembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 18
    Points : 43
    Points
    43
    Par défaut Crash inexplicable lors de l'appel de "delete"
    Bonjour tous le monde,

    voila mon problème consiste en un crash non expliqué lors de l'appel de l'operateur delete[].

    Voici le code:
    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
     
    char* l_pChar =  new char[i_sHexaValue.toStdString().size()];
     
            strcpy(l_pChar,i_sHexaValue.toStdString().c_str());
     
            unsigned char* l_pUnsignedChar = new unsigned char[i_sHexaValue.toStdString().size()];
            l_pUnsignedChar = reinterpret_cast< unsigned char * >(l_pChar);
     
            char const* l_pcFinalValue = new char const[i_sHexaValue.toStdString().size()];
            l_pcFinalValue = reinterpret_cast< char const * >(l_pUnsignedChar);
            l_sResult = QString(l_pcFinalValue);
     
            delete[] l_pChar;
            delete[] l_pUnsignedChar;
            delete[] l_pcFinalValue;
    J'espère avoir une explication de ce comportement (peut être prévisible et attendu).
    Je vous remercie d'avance.

  2. #2
    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
    Bonjour,

    Il y a plusieurs problèmes.

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       l_pUnsignedChar = reinterpret_cast< unsigned char * >(l_pChar);
       l_pcFinalValue = reinterpret_cast< char const * >(l_pUnsignedChar);
    Une fois passé ce bout de code les trois pointeurs l_pChar, l_pUnsignedChar et l_pcFinalValue ont tous la même valeur donc pointent vers le même morceau de mémoire. Du coup ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    delete[] l_pChar;
    delete[] l_pUnsignedChar;
    delete[] l_pcFinalValue;
    appellent trois fois delete[] sur le même pointeur -> segfault

    2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* l_pChar =  new char[i_sHexaValue.size()];
    strcpy(l_pChar,i_sHexaValue.c_str());
    Dans la première ligne tu alloues un tableau de char de la taille de i_sHexaValue. Hors dans la deuxième ligne tu copie dans ce tableau une chaine de taille size + 1 (car il y a le '\0' en plus), donc il y a un dépassement de tableau.

  3. #3
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Après la ligne 7, l_pUnsignedChar et l_pChar pointent au même endroit. De même ligne 10 avec l_pcFinalValue.

    Donc les delete[] vont tenter de libérer trois fois la même chose.
    Ce qui est interdit.

    Au passage, tu ferais bien de revoir comment fonctionnent les pointeurs.

    [EDIT : Le temps de taper le message ... !]

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Euh, je vois aussi beaucoup d'acrobaties dans un but que je ne cerne pas vraiement?
    Ton but est visiblement de faire une série de reinterpret_cast sur des pointeurs...pourquoi l'allocation dynamique et la recopie dans ce cas?
    Pour mémoire l'allocation dynamique à la main est à éviter comme la peste à moins d'y être vraiement obligé, justement à cause des risques d'erreur de gestion de la mémoire qui sont si vite arrivées.

  5. #5
    Membre du Club

    Inscrit en
    Décembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 18
    Points : 43
    Points
    43
    Par défaut
    Bon, je vais vous expliquer un peu mon "besoin". En faite, je récupère une valeur comme étant un string, je dois l'interpréter comme étant un unsigned char * et je dois par la suite l’écrire dans un fichier xml (donc la reconvertir en string..).
    Si vous avez une meilleur proposition a donner, je suis prenant..
    Et merci encore.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Si je comprends bien, c'est un besoin de VOIR le même tableau de char (aucune modification en vue je présume?) sous trois angles (unsigned char*, const char*).
    Pour les visions const, qui ne seront jamais modifiées, aucune raison de faire de copie.
    Que fais-tu à ton unsigned char*? Ecris-tu dedans?

  7. #7
    Membre du Club

    Inscrit en
    Décembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 18
    Points : 43
    Points
    43
    Par défaut
    Non je modifie pas le unsigned char

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    As tu la maîtrise sur le code qui l'utilise (en lecture, donc)? Si tu pouvais aller vers const unsigned char*, tu n'aurais aucune copie (donc aucun new, et aucun delete) à faire, juste à initialiser des pointeurs alias. L'intérêt du const étant d'interdire la modification, donc de garantir que tu n'auras pas d'effets de bord incompréhensibles.

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

Discussions similaires

  1. Flash lors de l'appel d'un état Crystal report 7
    Par IADJOFOGUE dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 12/05/2005, 11h10
  2. Erreur lors de l'appel d'un page ASP
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 27/08/2004, 15h17

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