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

VC++ .NET Discussion :

erreur débogage vc++


Sujet :

VC++ .NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut erreur débogage vc++
    slt, je travaille sous vc++ , mon code s'exécute normalement mais quand je viens de fermer la boite de dialogue, je trouve l'erreur suivante(boite de message):

    HEAP CORRUPTION DETECTED: after block #119 at 0x001063C8
    CRT detected that the application wrote to memory after end of heap buffer

    est ce cela peut être du aux pointeurs?( j'utilise l'allocation dynamique )
    j'ai vérifié la taille des tableaux et je ne trouve pas qu'ils sont inférieures à la taille des données contenues.

    Quelqu'un peut m'aider s'il vous plait?

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    cette erreur signifie que quelque part tu écris en dehors de la mémoire que tu as alloué. Du coup le tas est corrompu et lorsqu'il essaie de tout désallouer, ça crashe.

    Il y a milles façons de créer une "heap corruption", mais bien évidemment, une mauvaise manipulation de pointeurs est bien souvent la cause. C'est une des raisons pour lesquelles on dit: "utiliser les pointeurs que quand on ne peut pas faire autrement".
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pour être précis, vous avez ce message car vous êtes en mode DEBUG et, avec les bonnes options de compilation, à chaque fois que vous faite une allocation dans le tas, le C-Runtime en DEBUG ajoute quelques octets avant et après la zone mémoire qui est fourni au programme.
    Par exemple, après un appel à la fonction malloc de X octets qui retour un pointeur P, alors, dans la mémoire du processus, il y a quelques octets aux adresses juste inférieurs à P avec des valeurs spéciales, type 0xCC, et il y a quelques octets aux adresse juste supérieurs à P+X qui contiennent aussi des valeurs spéciales.

    Au moment d'une libération de mémoire, la C-Runtime vérifie pour tous les bloques de mémoires qu'elle a allouée (et pas uniquement celle qu'elle est en train de désallouer), que ces 2 zones contiennent toujours ces valeurs spéciales.
    Si ce n'est plus le cas, la C-Runtime ouvre cette fameuse fenêtre d'alerte.

    Attention, cette vérification à la libération de mémoire n'est pas systématique à moins de le spécifier avec _CrtSetDbgFlag (entre autre).
    http://msdn.microsoft.com/en-us/libr...(v=vs.71).aspx

    Moi, sur ce genre de problème, j'active le check systématique de la mémoire pour prendre le code fautif la main dans le sac.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    slt, merci pour la réponse. Cela m'a clarifié les choses
    pour la fonction _CrtSetDbgFlag , elle est utilisée en C alors que je travaille avec VC++ ( opérateur new et delete pour les pointeurs).

    pour le check systématique de la mémoire, comment l'activer? Merci

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Les primitives new et delete utilisent les primitives malloc et free.

    Donc CrtSetDbgFlag marche aussi pour les allocations C++ "standard".

    pour le check systématique de la mémoire, comment l'activer? Merci
    C'est pratiquement dans l'exemple de la page MSDN que je vous ai fourni.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Get the current state of the flag
    // and store it in a temporary variable
    int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );
     
    // Turn On (OR) - launch _CrtCheckMemory from
    // being called at every allocation request
    tmpFlag |= _CRTDBG_CHECK_ALWAYS_DF;
     
    // Set the new state for the flag
    _CrtSetDbgFlag( tmpFlag );

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    si je mets ce code dans chaque fichier .cpp , est cela est suffisant ?ou bien après chaque allocation et désallocation de mémoire? Merci

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    si je mets ce code dans chaque fichier .cpp , est cela est suffisant ?ou bien après chaque allocation et désallocation de mémoire? Merci
    Houlà, vous êtes un peu jeune dans le C/C++ semble-t-il.

    Avec cette fonction de la C-Runtime, vous modifiez le comportement de la C-Runtime, donc de tous le code qui se sert de la C-Runtime et cela dés l'appel de cette fonction.

    Vous n'avez qu'à APPELLER cette fonction UNE seule fois.
    Au début de la fonction main par exemple, si vous voulez vérifier dés le départ que votre heap (tas) mémoire n'est pas corrompu.

    Les variables globales seront déjà allouée au moment du début de la fonction main, donc de l'appel de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _CrtSetDbgFlag( tmpFlag );
    , donc vous ne pourrez pas vérifier quelle constructeur d'une variable globale fout le Bronx dans le tas, mais les variables globales, c'est mal.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    J'ai une application MFC, donc je n'ai pas de main() . j'ai mis le code au niveau de chaque constructeur avant l'allocation de mémoire ??

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous n'avez pas de "main" mais un équivalent : la méthode "InitInstance" de la classe dérivant de "CWinApp".

    j'ai mis le code au niveau de chaque constructeur avant l'allocation de mémoire ??
    Arrêtez de jouer au galérien.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    OK MERCI et pour les classes qui n'ont pas de initInstance() (qui héritent de CDialog)?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 98
    Points : 39
    Points
    39
    Par défaut
    je crois que je l'ai trouvé ca correspond à la fonction OnInitDialog() pour les fichiers crées par défaut mais pour les classes que j'ai ajouté et qui héritent de CDialog, cette fonction n'existe pas , aussi pour les classes qui héritent de CWnd.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous n'avez qu'à APPELLER cette fonction UNE seule fois.
    J'ai bien dit une fois (par programme) et non par classe.

    Vous n'avez qu'à modifier que la méthode "InitInstance" de la classe dérivant de CWinApp, ET PUIS C'EST TOUT.

Discussions similaires

  1. [XL-2003] erreur débogage 9, travail avec 2 fichiers
    Par Muggsy_68 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/01/2012, 15h30
  2. Réponses: 20
    Dernier message: 18/01/2011, 12h47
  3. Réponses: 3
    Dernier message: 23/07/2007, 11h26
  4. Erreur de débogage
    Par mambo dans le forum Visual C++
    Réponses: 11
    Dernier message: 29/08/2006, 09h15
  5. Réponses: 8
    Dernier message: 20/01/2006, 13h46

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