Comment debugger : incorrect checksum for freed object

Fermé
toe - 17 oct. 2012 à 18:15
 toe - 18 oct. 2012 à 02:31
Bonjour,
Je cherche à effectuer un algorithme de plus court chemin successivement sur plusieurs graphe, pour ce faire j'utilise la boucle suivante:
  for(i=0;i< indi[0].getNbPeriodes();i++)
        {
                       //On regarde s'il y a à reévaluer
            if(indi[0].getEvalSemaine(i)==-1)
            {
                //On construit le graphe
              //  cout<<"on va creer graphe \n";
                  double aDeverser =indi[0].getQuantiteSemaine(i);
                Graphe G(pas,longueurPeriode,i*longueurPeriode,quantiteDeversee,aDeverser,&systeme);
                cout <<"sommets créés : "<<G.getNbSommet()<<endl;
                  if(indi[0].getQuantiteSemaine(i)!=aDeverser)
                  {
                        double diff= indi[0].getQuantiteSemaine(i)-aDeverser;
                        indi[0].setQuantiteSemaine(i-1,indi[0].getQuantiteSemaine(i-1)+ diff);
                        indi[0].setQuantiteSemaine(i, aDeverser);
                  }
                
                G.genererArcs();
                //cout<<"on a cree graphe \n";
                //On applique l'algorithme de Bellman
                double eval = G.plusCourtChemin();
               
                indi[0].setEvalSemaine(i,eval);
              

            }
            evaluation= evaluation+indi[0].getEvalSemaine(i);
            quantiteDeversee= quantiteDeversee + indi[0].getQuantiteSemaine(i);

        }


Mais à la 2eme itération lorsque je veux créer mon graphe j'obtiens l'erreur suivante :

deltaPlaningEA(2859,0x7fff7a144960) malloc: *** error for object 0x7f98494018b8: incorrect checksum for freed object - object was probably modified after being freed.

Qui a lieu plus exactement à l'endroit commenté ERREUR :
 Graphe( int _pas, int _nbHeures, int _heureDebut,double qtePerdu, double &_qteADeverser, Systeme* _systeme)
    {
        //variables
        int i,j;
        double V;
        double max=0;
        pas=_pas;
        nbHeures=_nbHeures;
        heureDebut=_heureDebut;
        systeme= _systeme;
        qteADeverser=_qteADeverser;
    
        
        Vinit = systeme->getReservoirs()[1].getVinit() - qtePerdu;
        
        for(i=0;i<heureDebut;i++)
        {
            Vinit= Vinit + systeme->getReservoirs()[1].getApport()[i]-  systeme->getReservoirs()[1].getReserve();
        }
        if (Vinit<0)
        {
            qteADeverser= qteADeverser -Vinit;
            Vinit=0;
            
        }
        V= Vinit;
        bool verif;
       
        
       
        reserve= systeme->getReservoirs()[1].getReserve();
        Apport=(double*)malloc( nbHeures*sizeof(double));
        kmax=0;
        Vmax= systeme->getReservoirs()[1].getVmax();
        nbTurbine =systeme->getNbTurbines();
        for(i=heureDebut;i<heureDebut+nbHeures;i++)
        {
            Apport[i]= systeme->getReservoirs()[1].getApport()[i];
        }
        for(i=0;i<nbTurbine;i++)
        {
            kmax= kmax + systeme->getTurbine(i).getQMax();
        }
        cout <<"on va creer les sommets\n";
        
        //Création des sommets :
        //histoire du Vracine à revoir...
        Sommet racine(V,heureDebut-1,qteADeverser);
        nbSommets= 1;
         cout <<"on va ajouter racine\n";
        //cout<< sommets.size()<<endl;
        sommets.push_back(racine);//ERREURE
        cout <<"on a ajouté racine\n";
        for(i=0;i<nbHeures-1;i++)
        {
          verif=false;
            V=V + Apport[i]-reserve;
            max=max+ kmax;
            if(max>V) max=V;
            if(max> qteADeverser) max =qteADeverser;
            j=0;
            while(j<=max)
            {
                if(V-j <= Vmax)
                {
                    Sommet s(V-j,i+heureDebut, qteADeverser-j);
                    sommets.push_back(s);
                    nbSommets++;
                    verif=true;
                }
                j=j+pas;
            }
            
        
        if(verif==false)
        {
            Sommet sommet (Vmax,i+heureDebut,qteADeverser-(V-Vmax));
            sommets.push_back(sommet);
            nbSommets++;
            max= V-Vmax;
        }
        
    
        
        
    }
        V=V+Apport[nbHeures-1] - reserve;
        if(V-qteADeverser>0)
        {
            Sommet sommet(V- qteADeverser,nbHeures-1+heureDebut,0);
            sommets.push_back(sommet);
        }
        else{
            Sommet sommet(0,nbHeures -1 +heureDebut,0);
            sommets.push_back(sommet);
            
        }
        nbSommets++;
       // cout <<"fin creation sommets "<<endl;
    }

A vrai dire je cherche depuis plusieurs heures, mais je n'ai vraiment plus d'inspiration...
Auriez vous des suggestions quand à l'origine possible de ce bug?

Je remercie de part avance ceux qui auront le courage de se pencher sur ce problème



1 réponse

Cette erreur peut elle survenir pour autre chose que la modification d'un objet désaloué? Toute indication serait la bienvenue...
0