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

SL & STL C++ Discussion :

Probleme de memoire apres un passage de parametre


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut Probleme de memoire apres un passage de parametre
    Salut

    j'ai un probleme avec STL. le defini la fonction suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int LPTonLine(int m,int k, vector<task>& lt, vector<int> st,vector<int>dist,vector<int>& fin){
    .............................
    }
    Dans cette fonction, je modifie quelques elements dans lt et quelques valeurs de fin. Mais, je n'ajoute ou supprime aucun element.

    Lors de l'execution, la fonction s'exécute entierement, mais à la fin, j'obtient le message suivant


    Pouvez vous m'aider à deboguer ceci??
    Merci



    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    *** glibc detected *** ./schedule: free(): invalid next size (fast): 0x09b332a8 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0xc543a4]
    /lib/libc.so.6(cfree+0x96)[0xc56356]
    /usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x2db4591]
    ./schedule[0x80515a1]
    ./schedule[0x80515cb]
    ./schedule[0x8051604]
    ./schedule[0x8051685]
    ./schedule[0x804d978]
    ./schedule[0x804e573]
    /lib/libc.so.6(__libc_start_main+0xe5)[0xbfb6e5]
    ./schedule[0x8048a91]
    ======= Memory map: ========
    004c2000-004c3000 r-xp 004c2000 00:00 0          [vdso]
    00bc0000-00be0000 r-xp 00000000 fd:00 16103      /lib/ld-2.9.so
    00be1000-00be2000 r--p 00020000 fd:00 16103      /lib/ld-2.9.so
    00be2000-00be3000 rw-p 00021000 fd:00 16103      /lib/ld-2.9.so
    00be5000-00d53000 r-xp 00000000 fd:00 16104      /lib/libc-2.9.so
    00d53000-00d55000 r--p 0016e000 fd:00 16104      /lib/libc-2.9.so
    00d55000-00d56000 rw-p 00170000 fd:00 16104      /lib/libc-2.9.so
    00d56000-00d59000 rw-p 00d56000 00:00 0 
    00d5b000-00d82000 r-xp 00000000 fd:00 16108      /lib/libm-2.9.so
    00d82000-00d83000 r--p 00026000 fd:00 16108      /lib/libm-2.9.so
    00d83000-00d84000 rw-p 00027000 fd:00 16108      /lib/libm-2.9.so
    02c51000-02c5e000 r-xp 00000000 fd:00 16116      /lib/libgcc_s-4.3.2-20081105.so.1
    02c5e000-02c5f000 rw-p 0000c000 fd:00 16116      /lib/libgcc_s-4.3.2-20081105.so.1
    02cfb000-02de2000 r-xp 00000000 fd:00 893735     /usr/lib/libstdc++.so.6.0.10
    02de2000-02de6000 r--p 000e6000 fd:00 893735     /usr/lib/libstdc++.so.6.0.10
    02de6000-02de8000 rw-p 000ea000 fd:00 893735     /usr/lib/libstdc++.so.6.0.10
    02de8000-02ded000 rw-p 02de8000 00:00 0 
    08048000-08053000 r-xp 00000000 fd:00 313806     /home/adel/workspace/parco3/schedule
    08053000-08054000 rw-p 0000a000 fd:00 313806     /home/adel/workspace/parco3/schedule
    09b31000-09b52000 rw-p 09b31000 00:00 0          [heap]
    b7600000-b7621000 rw-p b7600000 00:00 0 
    b7621000-b7700000 ---p b7621000 00:00 0 
    b77c2000-b77c5000 rw-p b77c2000 00:00 0

  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
    Bonjour,
    il faudrait que tu montres l'appel de la fonction et son corps. Car comme ça, il n'y a pas assez d'éléments pour te répondre.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour,
    il faudrait que tu montres l'appel de la fonction et son corps. Car comme ça, il n'y a pas assez d'éléments pour te répondre.
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    int LPTonLine(int m,int k, vector<task>& lt, vector<int> st,vector<int>dist,vector<int>& fin){
     
             int cmax=0;int c;
             float s=0;
             int debug=0;
     
     
             bool b;
     
             vector<int> events(k);for (int i=0;i<k;i++)events[i]=st[i]-dist[i];
             vector<int> exectks(m); for (int i=0;i<m;i++)exectks[i]=-1;
     
     
             while (!allscheduledOnline(lt) ){
     //       	 cout <<"----------------------------------debug    =  "<<debug++<<endl;
            	 int tmin=*(std::min_element( events.begin(), events.end()));
            	 int tmin_proc=std::distance(events.begin(),
    		              std::min_element( events.begin(), events.end()) );
            	 // j ordonnance la première tâche à cette machine
     
            //	 cout <<"tmin = " <<tmin << endl;
     
            	 int i=0;
            	 for (;lt[i].isScheduledOL();i++);
     
     
            	 int selected=m+k-1;
                 // les procs disponibles
                 for (int j=m+k-2; j>k-1; j--){
                	 if (fin[j] < fin [selected] ){
                       	 selected=j;
                       	 assert(selected<m+k);
                	 }
                 }
     
     
                for (int j=k-1; j>=0 ; j--){
                  //cerr <<fin[selected]<<"\t"<< j << "\t"<< fin[j]<<"\t"  << lt[i].getp()<<"\t" <<st[j]<< endl;
     
               	 if ((fin[j]<fin[selected])&&(fin[j]+lt[i].getp()<=st[j])){
               		 //cerr<< "la tâche rentre " << endl;
               		 selected=j;
               		 assert(selected<m+k);
               	 }
                }
    //            cout << "LPTOL:: selected = " << selected
    //                   << "fin = "<< fin[selected]<< endl;
                if (selected<k){
                //	cout <<  lt[i].getp() << endl;
                	s+= lt[i].getp();
                	//cout <<"LPTOL ::  s= " <<  s << endl;
                };
     
     
                assert(selected<m+k);
     
                b=false;
                for (int x=0; x<k; x++) {
                	if ((exectks[x]!=-1)&&(lt[exectks[x]].getLPTOLst()+lt[exectks[x]].getp()>events[x])){
                        lt[exectks[x]].setScheuledOL(false);
     
                        //cout << "je retire la tache  " << lt[exectks[x]].getId()<<endl;
                        exectks[x]=-1;
                		st[x]=events[x];
                		fin[x]=events[x];
     
                		b=true;  // pour sauter
                	}
                }
                if(b)continue;
     
                lt[i].LPTOL(selected,fin[selected]);exectks[selected]=i;
                //time=fin[selected];
                fin[selected]+=lt[i].getp();
                if (fin[selected]>cmax)cmax=fin[selected] ;
                //cout << "cmax tempo = " << cmax << endl;
     
             }
     
             return cmax;
    }
    L'appel se fait comme ca!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      cmaxLPT=LPTonLine(m,k,tl,st,dis,fin);
      cerr <<cmaxLPT<<endl;

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Typiquement, tu désalloues une variable dynamique (=> dans le tas) de "mauvaise taille". Le problème viens plus souvent d'une variable mal alloué (allouer avec une taille trop petite, voir pas allouer du tout).

    Aussi, si la présence de la fonction fait planter, je suggère que tu as écrit dans de la mémoire (tas) non-alloué.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2003
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 160
    Par défaut
    en fait, j'utilise c++ et la bibliotheque STL pour ne pas à avoir ces problemes d'allocation et de desallocation.

    ce qui est bizare, est que quand je modifie la methode à la quelle je fais appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
               ////lt[i].LPTOL(selected,fin[selected]);exectks[selected]=i;
                lt[i].setScheuledOL(true);exectks[selected]=i;
    mon programme ne plante plus!!
    LPTOL et setScheuledOL(true) sont deux methodes de la meme classe qui ne font aucune allocation mémoire (voir code). toutes deux prennent des variables en arguments et les affectent au membres de la classe. Pourtant, pour la premiere, ca plante, et pour la deuxieme , ca passe.

    Remarque: LPTOLproc, LPTOLst=b et scheduledOL sont des membres de la classe task.

    Merci pour votre aide



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int task::LPTOL(int a,int b){
     LPTOLproc=a;
     LPTOLst=b;
     cerr<<"LPTOLASSIGN  id="<<id << "   proc="<<LPTOLproc<< "   de " << b << "  a "<< b+p     <<endl;
     scheduledOL=true;
     return b+p;
    };
     
    void task::setScheuledOL(bool b){
      scheduledOL=b;
    };

  6. #6
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Je n'ai pas lu ton programme, mais es-tu sûr que fin[selected] n'est pas dangereux ?

    Sinon, réutilises-tu les variables changé dans la fonction "bugé" ?

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

Discussions similaires

  1. [Web Service][SOAP] Probleme de passage de parametres
    Par _Froggy_ dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 22/03/2006, 20h54
  2. Réponses: 7
    Dernier message: 20/03/2006, 12h19
  3. [XSL][PHP] probleme de passage de parametres...
    Par jesus144 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/06/2005, 23h25
  4. [pgplsql] probleme de passage de parametre
    Par Spoutnik dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/05/2004, 01h11
  5. Probleme de passage de parametre a un TQuery
    Par gve21 dans le forum C++Builder
    Réponses: 7
    Dernier message: 15/01/2004, 15h49

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