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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif

    Inscrit en
    Décembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 18
    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 Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    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 émérite
    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
    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 Expert
    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
    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 actif

    Inscrit en
    Décembre 2009
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 18
    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 Expert
    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
    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 actif

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

+ 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