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 :

(C++ déb.) Impossible de désallouer de la mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Par défaut [Résolu] (C++ déb.) Impossible de désallouer de la mémoire
    Bonjour,

    Je vous propose d'abord mon code (pour que vous constatiez que je suis vraiment débutant :) )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Début de ma fonction]
      int NbDonnees;
      double *Gronk;
      double *Greuh;
      NbDonnees = 1 + n - 5;
      Gronk = new double[NbDonnees];
      NbDonnees = 1 + n + 2;
      Greuh = new double[NbDonnees];
    [Plein de lignes de codes qui utilisent Gronk et Greuh]
      delete[] Gronk;
      delete[] Greuh;
    [Fin de ma fonction]
    (Petite précision : cette fonction est appellée depuis une boucle et ne plante jamais la première fois, mais plutôt à partir de n fois...)

    Le problème est que lorsque j'arrive aux delete, selon les variables, des fois il plante, des fois il plante pas...
    Quand il plante, toujours le message "User breakpoint called from code at 0x77f65a58" sur un "int 3" (disassembly)

    Et vu que même google-isé, je n'ai pas de réponse à ce problème, je viens vous le présenter avec grand espoir (vu que, forcément, c'est super urgent ;) )
    Je sens bien le pointage dans des zones mémoires aléatoires, mais je vois pas comment y remédier.
    En virant les delete (pas bien, je sais), il plante sur le "new" à la n-ième boucle...

    Merci bien et bonne journée-soirée-après midi (rayer les mentions inutiles)

    G.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Soit tu voulais bien allouer un seul double pour chaque variable (c'est ce que tu fais) et dans ce cas il faut utiliser delete (pas delete[]), soit tu voulais allouer un tableau de NbDonnees doubles, et dans ce cas il faut utiliser new[x] (pas new(x)).

    A voir ton code et tes remarques, je pencherai plutôt pour la seconde hypothèse.

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    idem je pense que c'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      NbDonnees = 1 + n - 5; 
      Gronk = new double(NbDonnees); 
      NbDonnees = 1 + n + 2; 
      Greuh = new double(NbDonnees);
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      NbDonnees = 1 + n - 5; 
      Gronk = new double[NbDonnees]; 
      NbDonnees = 1 + n + 2; 
      Greuh = new double[NbDonnees];

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Par défaut Oops
    Mon code comprend bien des crochets, pas des parenthèses, désolé.
    Je me suis trompé en le recopiant...

    Donc problème toujours pas résolu :c)

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Alors il faut voir tes boucles. Je pense que tu fais un dépassement d'indice quelque part.

  6. #6
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Tu pourrais faire un copier coller de ton code stp Skyou

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    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
    [Début de ma fonction]
     
      int NbDonnees;
      double *Gronk;
      double *Greuh;
     
      double *GronkTmp;
      double *GreuhTmp;
     
     
      NbDonnees = 1 + n - 5;
      Gronk = new double[NbDonnees];
      GronkTmp = Gronk;
     
      NbDonnees = 1 + n + 2;
      Greuh = new double[NbDonnees];
      GreuhTmp= Greuh ;
     
    [Plein de lignes de codes qui utilisent Gronk et Greuh]
     
      delete[] GronkTmp ;
      delete[] GreuhTmp;
     
    [Fin de ma fonction]
    Essaies ce code ça permettra d'enlever un doute sur une erreur classique.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Par défaut Marche toujours pô :(
    Pour moladvi : ça plante aussi sur les delete des copies (---tmp).
    Donc, a priori, c'est pas un dépassement d'indice (ou me gourre-je ?)

    Voili voilou, j'en suis là et las, aussi ;c)

    Merci à vous de prêter attention à mon cas de débutant qui essaye de trouver une solution

    Ah, en passant, j'ai essayé avec des Résultat : il plante pas aux désallocations, mais à la fin de la fonction (au )

    Merci bien

    G.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Par défaut Le code en question
    Bon, j'ai fini par l'édulcorer et le code est disponible là !

    http://heureuxpolipe.free.fr/CodeASouci/MonCode.txt

    Désolé d'avance pour ceux que ça fera hurler...

    Bonne soirée à toutes et tous

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Désolé, mais là c'est pas maintenable. Je laisse les plus courageux y jeter un coup d'oeil approfondi.

    Un conseil. Coupe, coupe, et redécoupe jusqu'à avoir des fonctions de moins de 15 lignes.

    Le dépassement de capacité est la cause la plus probable au vu des symptômes.

    Il serait d'ailleurs souhaitable d'extraire le code minimal (et qui reste suffisant à reproduire ton problème).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut Re: [C++/Débutant] Impossible de désallouer de la mémoire
    Citation Envoyé par Skyou
    Bonjour,

    Je vous propose d'abord mon code (pour que vous constatiez que je suis vraiment débutant )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [Début de ma fonction]
      int NbDonnees;
      double *Gronk;
      double *Greuh;
      NbDonnees = 1 + n - 5;
      Gronk = new double[NbDonnees];
    Je n'appelle pas ça du code de débutant. Du code de débutant utiliserait une classe pour gérer les tableaux de taille variable, comme un vector<double>, et sur un bon compilateur, ce code ferait automatiquement une vérification d'indices (du moins en mode débug) afin d'aider l'auteur à voir les étourderies...

    Et puis un code de développeur avancé aussi, d'ailleurs...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Si tu as essayé mon code et que ça plante, cela veut tout simplement dire que tu effectues un dépassement de capacité. Tu écrases les valeurs de fin d'allocation qui permettent justement de désallouer la mémoire( à la fin de la mémoire que tu as alloué il y a des valeurs qui permettent au programme de connaître exactement la zone à désallouer: si tu modifies les données de cette zone le programme ne peut plus désallouer et ça plante).

    Si j'ai le courage je regarderai ton code...

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 107
    Par défaut C'était bien une erreur d'indice, merci ;c)
    C'était bien une erreur d'indice, merci ;c)

    Pour JolyLoic : je pense que tu peux économiser les touches de ton clavier en évitant de faire des remarques aussi peu constructives que celle-ci.

    Pour les autres : merci de vous être soucié de mon cas et bonne journée ! :c)

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Sa remarque est pourtant juste -- même si pas directement liée à ton problème.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Désallouer de la mémoire.
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 23/11/2010, 15h50
  2. Fuite mémoire, comment bien désallouer ?
    Par k3ops dans le forum OpenCV
    Réponses: 10
    Dernier message: 03/07/2008, 16h47
  3. [2.0] Comment désallouer de la mémoire
    Par franculo_caoulene dans le forum Windows Forms
    Réponses: 8
    Dernier message: 18/03/2008, 14h14
  4. Réponses: 6
    Dernier message: 23/02/2007, 15h04
  5. XE dernière version, impossible re retailler la mémoire
    Par SheikYerbouti dans le forum Oracle
    Réponses: 5
    Dernier message: 02/02/2007, 07h53

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