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 :

delete provoque erreur heap


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Par défaut delete provoque erreur heap
    Bonjour.

    Je code depuis maintenant 2 mois un programme en C++ avec la lib Qt sous Qt Creator.

    Depuis peu je suis confronté à un problème lié au Heap. En effet j'ai des erreurs qui sautent en debug sur les différents delete [] de mes tableaux d'uchar :

    HEAP[xxx.exe]:
    Heap block at 0AB3DFA8 modified at 0AB3DFBE past requested size of e
    HEAP[xxx.exe]:
    Invalid address specified to RtlFreeHeap( 003B0000, 0AB3DFB0 )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SerialFrame::~SerialFrame()
    {
        delete[] frame; //debug s'arrete ici
        frame=NULL;
    }
    Si je commente mon delete, pas de soucis le programme tourne. Sinon je me retrouve avec les erreurs précédentes en Debug ou des erreurs masquées par le FTH.

    Je ne sais pas si l'erreur est masquée durant l’utilisation du tableau et qu'elle n'apparait qu'au moment du delete, ou si c'est le delete lui même qui provoque l'erreur.

    D'avance merci pour votre aide !

  2. #2
    screetch
    Invité(e)
    Par défaut
    hmm d'après le debugger tu aurais une sorte d'ecrasement mémoire, i.e. tu accèdes a ton buffer au dela de sa taille.
    Par exemple, tu pourrais allouer 20 octets de plus (ou 100 ou 1000, ca dépend de ce qui a un sens) et voir si l'erreur disparaît.
    Si oui, le mieux serait alors de mettre un "memory breakpoint" a l'endroit ou le tableau est modifé alors qu'il ne le devrait pas.
    Enfin, cette erreur peut arriver parfois si tu utilises la mauvaise ocmbinaison new/delete
    (allouer avec new, deleter avec delete[] ou allouer avec new[] et deleter avec delete)

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Ou alors la mémoire avait déjà été libérée. 2 conseils : std::vector à la place de new[]/delete[] et pointeurs intelligents si tu n'as pas le choix.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Pour ce genre de problème valgrind est super efficace (son seul soucis est qu'il ne fonctionne qu'en environnement linux). Pour l'utiliser pas besoin de recompiler ton code, et en plus il peut t'indiquer où la libération à déjà été effectuée etc...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 11
    Par défaut
    Merci à tous !

    En re-parcourant mon code j'ai trouvé des endroits fautifs (dépassement de fin de tableau lors de la copie du tableau pour affecter un tableau plus grand). Il y a des chances que le problème vienne de là.

    Cependant je ne peux pas encore l'assurer, étant donné que j'ai des Segmentation fault qui sautent à l'autre bout du programme (manipulation de QTableWidget...)

    PS : J'avais vu Valgrind mais je suis sous windows, l'adaptation Linux n'est pas prête pour pouvoir la faire tourner avec Valgrind... (puis j'ai pas encore de machine Linux accessoirement ^^)

  6. #6
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Il faudrait que tu regardes dans les options de compilations, certaines te permettront d'éviter bien des problèmes. La première consiste à compiler avec -Wall plus quelques autres qui ne sont pas prises en comptes par Wall.

    Tes dépassement de tableau en début peuvent très bien avoir une répercution beaucoup plus loin.

Discussions similaires

  1. [MySQL] Delete doublons ERREUR
    Par mikathieut dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/09/2008, 16h30
  2. [Spip] Plugin perso provoque erreur http 302
    Par mama07 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 31/12/2007, 17h13
  3. delete provoque un plantage
    Par oodini dans le forum C++
    Réponses: 12
    Dernier message: 24/08/2007, 14h35
  4. alter table on delete cascade, erreur syntaxe
    Par sam01 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 25/11/2006, 22h06
  5. Erreur --> HEAP: Free Heap block à la fermeture
    Par Marthym dans le forum MFC
    Réponses: 1
    Dernier message: 23/01/2006, 11h41

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