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 :

double free or corruption


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut double free or corruption
    Hello tout le monde,

    voilà, j'ai un bête problème de pointeur dans mon code qui m'amène à une erreur de type
    *** glibc detected *** ./percolation: double free or corruption (!prev): 0x09525138 ***

    Voici les bribes utiles de mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    int *lat; //<- variable déclarée globalement
     
    percolation::percolation(int seed, float proba, int N)
    {
    ...
    lat = new int[squareN]; //a l'initialisation de la classe, j'alloue la mémoire à ma variable
    ...
    }
     
    //A un moment, j'appelle la fonction suivante
    int percolation::addToCluster(int i,int mainCluster,int * M,int k)
    {
    ...
        lat[i] = lat[mainCluster]; //<- selon mes tests, c'est précisément à cause de cette ligne que l'erreur apparait.
     
        M[lat[i]]++;
     
        return k;
    }
     
    //naturellement, le destructeur de mon objet libère la mémoire
    percolation::~percolation()
    {
        delete [] lat;
    }
    Concernant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lat[i] = lat[mainCluster];
    Si je la mets en commentaire, je n'ai pas l'erreur. Si je la remplace par quelque chose du style
    Je n'ai pas l'erreur.

    J'appelle aussi la fonction addToCluster a un autre moment du code mais ca ne pose pas de bugg non plus...

    Voila, ca fait un moment que je tourne en rond sur google, sans trouvé la solution à mon problème.

    Si quelqu'un à une idée, je serais vraiment content.

    Salutations.

  2. #2
    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,
    L'utilisation de std::vector permettrait déjà d'écarter le double delete. std::vector::at te permettrait d'avoir une exception si les indices ne sont pas bons et pourrait t'aider en recherche de panne.
    Sinon, ben la même chose à la main : fait un assert sur tes indices là où tu adresses ton tableau pour voir si tu n'as pas un problème de dépassement d'indices.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Les variables globales, surtout des pointeurs, c'est le mal : conception à revoir ? Sans doute.

    Sinon as tu un constructeur de copie et un opérateur d'affectation ?

    Après +100 avec 3DArchi.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Les variables globales, surtout des pointeurs, c'est le mal : conception à revoir ? Sans doute.
    +1.
    Surtout que tu initialises ta mémoire dans ton constructeur. Or le rôle du constructeur c'est d'initialiser les variables membres. Je rejoins david : pourquoi une variable globale et pas une variable membre de ta classe ?
    Idem pour le destructeur, tu détruis une variable qui ne t'appartient pas... Elle pourrait être partagée, attention !

    Une fois ces problèmes de conception résolus, vérifie tes indices !

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    chrisburrc : exécuter votre appli via valgrind et il vous dira où sont vos problèmes
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci pour vos messages.

    En fait, je me suis mal exprimé. J'ai dit que ma variable était déclarée globalement, mais en fait elle est un attribut de ma classe. Il me manque un peu de jargon... désolé.

    Ensuite, selon les conseils de 3DArchi, j'ai remplacé tous mes pointeurs par des vecteurs. Très puissant, je connaissait pas. Merci.

    Malgrès ça, mon problème persiste. Mais de manière très étrange. En fait ma variable lat prends la taille du carré d'une variable donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    squareN = N * N;
    lat.assign(squareN,0);
    Et j'ai obtenu mon erreur uniquement pour une valeur de N=5. J'ai essayé N=4, 10, 100, 1000 et pas d'erreur qui fasse... Donc je baisse les bras, j'ai pas besoin de N=5 et pas le temps non plus.

    Citation Envoyé par Davidbrcz Voir le message
    Sinon as tu un constructeur de copie et un opérateur d'affectation ?
    Après +100 avec 3DArchi.
    Ca veut dire quoi cette combine ?


    Citation Envoyé par bruno_pages Voir le message
    chrisburrc : exécuter votre appli via valgrind et il vous dira où sont vos problèmes
    Merci du conseil. pas le temps ce soir, mais j'essayerais à l'occase

  7. #7
    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
    Citation Envoyé par chrisburrc Voir le message
    Malgrès ça, mon problème persiste. Mais de manière très étrange. En fait ma variable lat prends la taille du carré d'une variable donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    squareN = N * N;
    lat.assign(squareN,0);
    Et j'ai obtenu mon erreur uniquement pour une valeur de N=5. J'ai essayé N=4, 10, 100, 1000 et pas d'erreur qui fasse... Donc je baisse les bras, j'ai pas besoin de N=5 et pas le temps non plus.
    Il faut aussi remplacer les lat[index] par lat.at(index). Cette seconde version génère une exception si l'index est invalide.

    Citation Envoyé par chrisburrc Voir le message
    Ca veut dire quoi cette combine ?
    F.A.Q : Quand dois-je définir un constructeur par copie ?, Quand dois-je définir l'opérateur d'affectation ?, Qu'est-ce que la forme canonique orthodoxe de Coplien ?, Comment gérer proprement des allocations / désallocations de ressources ? Le RAII !.
    Mais l'utilisation des std::vector le fait pour toi.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/05/2019, 17h27
  2. [ProFTPd][glibc detected double free or corruption]
    Par Théolude dans le forum Administration système
    Réponses: 1
    Dernier message: 28/08/2008, 09h19
  3. [SFML] Image double free or corruption
    Par Belegkarnil dans le forum SFML
    Réponses: 4
    Dernier message: 23/08/2007, 16h56
  4. erreur glibc detected double free or corruption.
    Par Screwt-K dans le forum C++
    Réponses: 1
    Dernier message: 02/07/2007, 16h46
  5. Problème d'éxécution: double free or corruption
    Par ciol_tebroc dans le forum C++
    Réponses: 3
    Dernier message: 17/05/2006, 19h44

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