begin process at 2012 05 29 11:32:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

double free or corruption


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

double free or corruption

mardi 27 avril 2010 à 20:40:21 | double free or corruption

BirD

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 C/C++ :
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;
}


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.
BirD
mardi 27 avril 2010 à 22:59:29 | Re : double free or corruption

CptPingu

Administrateur CodeS-SourceS
Pas mal de petit soucis:
- Variable globale: Aucune, absolument aucune raison d'avoir une variable global en C++. Ici, la variable devrait être un attribut de classe normal ou statique. Ou encore un singleton.
- int*: En C++ on a des conteneurs: std::vector, std::list, std::deque, etc... Rare sont les cas où ils ne sont pas à privilégier sur des "type*" du C.
- La fonction addToCluster est vraiment bizarre. Il y a sûrement moyen de l'architecturer d'une autre manière. Ici, ce n'est pas la question, mais ton code semble architecturé au hasard.

Répondons un peu plus à ta question:
Je pense que c'est un problème vicieux, mais très classique.

Imagine que j'ai l'objet suivant: percolation p;
Si je passe "p" par copie, au lieu de le passer par référence, ça peut poser un gros problème.

void f1(percolation p);
void f2(percolation& p);
void f3(percolation* p);

Ici, il n'y aura pas de problème pour f2 et f3. En revanche, pour f1, l'objet p est copié lors du passage en argument. Toute copie locale à une fonction étant détruite au sortir de celle-ci, ton objet p est détruit. La variable globale lat est alors détruite une première fois. L'objet originale, lors de sa destruction détruira une deuxième fois celle-ci, d'où l'erreur.

Bien évidemment, il me faut plus de code pour te le confirmer, mais j'ai l'intuition que c'est le problème :p

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
mercredi 28 avril 2010 à 21:43:55 | Re : double free or corruption

BirD


Hello,

merci pour la réponse. Comme tu le vois, je suis pas super habitué au C++ et j'apprends un peu sur le tas...

En fait, quand je dis que j'ai déclaré ma variable globalement, c'est faut. Mon lat est un attribut de classe. De plus, selon ton conseil, j'ai modifié tous mes pointeurs en vecteur. Je connaissais pas ce type de truc... super puissant et tellement agréable.

Donc maintenant, le début de mon objet est comme ceci:
Code C/C++ :
includes, etc
...
class percolation
{
private:
...
    vector<int> lat;
...
public:
   
...

};


Mon problème persiste encore et toujours. J'ai fait encore quelques tests et j'avoue que c'est vraiment étrange. Mon vecteur lat est initialisé avec une certaine taille :
Code C/C++ :
squareN = N * N;
lat.assign(squareN,0);

De tous les N que j'ai essayé, je reçois l'erreur seulement quand N = 5...

BirD
mercredi 28 avril 2010 à 21:52:33 | Re : double free or corruption

CptPingu

Administrateur CodeS-SourceS
Utiliser un std::vector ne résoudra pas ton problème si c'est celui que je t'ai décrit. Ça reste une bonne chose.

Pas vraiment le choix. Il va falloir que tu crées un mini exemple avec ton code, de manière à ce qu'il mette en avant ton erreur.
Si tu peux fournir un petit exemple qui compile et qui provoque cette erreur, il devrait être aisée d'identifier la source de l'erreur.
Si ton code n'est pas trop gros, tu peux aussi le poster, ça sera plus simple de t'aider.

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio


Cette discussion est classée dans : code, int, double, lat, percolation


Répondre à ce message

Sujets en rapport avec ce message

Aide pour mega debutant [ par C++ ] Salut, bon alors je vien d ouvrir c++ mais comment mettre un code sur un boutton ???par exemple ce code comment je doits le mettre sur un bouton :int Cacher le curseur [ par BsEtZeOpLhD ] Salut.J'essay de cacher le curseur sous win Xp.J'ai fait le code suivant :#include int WINAPI WinMain(HINSTANCE hinstExe, HINSTANC Probleme avec le "linker" [ par Darkneon ] Salut,J'ai 3 fichiers comme ceciTest.cpp#include "test.h"#include void PrintA(int num){ for(int i=0; i<num; i++ Difference [ par xionoxid ] C'est koi la difference entre time (0) et time (NULL) les 2 font des nbr aleatoire !??#include #include #i Aide [ par eikonos ] Je travail sur une dll appellé psfg.dllj'ai ces lignes suivant de codetypedef struct CAMERAPARAM_tag{int nGain;int nOffset;int bOffsetFix;int nUpperLi besoin d'aide [ par ekinoks ] voila g trouver un code c++ pour decrypté un fichier mais je m'y conné pas dutout en c++ kunkun pouré m'aidéle code est :void p(FILE* fp, int seed) { exception et AfsMessageBox [ par poseidon2 ] Voic mon code: void *ImageLink::imageRecvThread(void *pParam){ ImageLink *iLink = (ImageLink*)pParam; int nIndex = 0; int nSizeRecv = 0; unsigned in Pointeur [ par casafa ] Bonjour tlm,Je suis débutant et je comprend à quoi sert les pointeurs...Quel est la différence entre ces 2 exemples, qu'est ce que le premier à en plu Erreur [ par LordBob ] Salut a tous,voila je voudrait faire un truc, mais je n'y arrive pas. Alors plutot que de vous expliquez ce que c'est, je vous montre le code.#include tableau a double entrée alloué dynamiquement [ par amortlintelligence ] Voila j'aurais voulu utiliser un tableau (tableau de tableau) dans une fonction. Je pense qu'il faut donc que je le crée dynamiquement avec un code du


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales