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 :

erreur de segmentation


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 299
    Par défaut erreur de segmentation
    Bonjour,

    Après la copie d'un pointeur dans un autre, j'obtiens une erreur de segmentation mais je ne comprends pas pourquoi.

    Voici le 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
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    void fullTreeInit(Element * elt, int depthTreeCurrent, int randDepth, vector<Element*>& leaves, int nbSeqByST, int *tabSeq, string * aligt, int racine, Element *father){ //si le noeud est la racine, racine=0 sinon racine=1
    	//cout<<"nbSeqByST : "<<nbSeqByST<<endl;
    	//cout<<"randDepth : "<<randDepth<<endl;
    	if(depthTreeCurrent==randDepth){
    		elt->STl=NULL;
    		elt->STr=NULL;
    		elt->posGap=-1;
    		elt->lengthGap=-1;
    		//elt->tabSequenceInST=NULL;
    		elt->sizeTab = nbSeqByST;
    		if(nbSeqByST==1){
    			elt->indexSequence=tabSeq[0];
    			//elt->tabSequenceInST=(int*)malloc(elt->sizeTab*sizeof(int));
    			memcpy( elt->tabSequenceInST, tabSeq,  sizeof(elt->tabSequenceInST) );
    			//elt->tabSequenceInST=tabSeq;
    		}
    		else{
    			elt->indexSequence=-1;
    			//elt->tabSequenceInST=NULL;
    		}
    	}
    	else{
    		//création des 2 sous arbres
    		//~ if(racine==1){
    			//~ elt->nodeFather=father;
    		//~ }
    		elt->STl = new Element();
    		elt->STr = new Element();
     
    		elt->STl->nodeFather=elt;
    		elt->STr->nodeFather=elt;
     
     
    		elt->sizeTab = nbSeqByST;
    		elt->indexSequence=-1;
    // 		cout<<"test"<<endl;
    // 		for(int i=0;i<elt->sizeTab;i++){
    // 			cout<<"tabSeq : "<<tabSeq[i]<<endl;
    // 		}
     
     
     
    		if(nbSeqByST!=0){
    			memcpy( elt->tabSequenceInST, tabSeq,  sizeof(elt->tabSequenceInST));
    		}
     
    		//on n'ajoute pas de gap sur un noeud contenant toutes les séquences
    		if(nbSeqByST==nbSequence){
    			elt->posGap=-1;
    			elt->lengthGap=-1;
    		}
    		else{
    			int minLength=min(nbSeqByST, tabSeq);
    			if(tossCoin(1.0)){
    				elt->posGap=random(0, minLength+1);//choix au hasard d'un nombre pour la position des gaps
    				elt->lengthGap=rand() %10+1;//nombre au hasard pour le nombre de gaps ajoutés
    				for(int j=0;j<nbSeqByST;j++){
    					int idSeq = tabSeq[j];
    					string seqGap=aligt[idSeq];
    					string newSeqGap="";
    					//~ aligt[idSeq]=addGap(seqGap, seqGap.size(), elt->posGap, elt->lengthGap, newSeqGap);
    				}
    			}
    			else{
    				elt->posGap=-1;
    				elt->lengthGap=-1;
    			}
    		}
     
    		int sizeTabL=0;
    		int sizeTabR=0;
    		int nbLeavesCurrent = expo(2, randDepth-depthTreeCurrent);//nombre de feuilles à* la fin du sous arbre
     
    		sizeTabL=random(0, nbSeqByST+1);
    		sizeTabL=seqShareRandom(nbLeavesCurrent, nbSeqByST, sizeTabL);
    		sizeTabR=nbSeqByST-sizeTabL;
     
    		//tableau avec les séquences se trouvant dans le sous arbre
    		int tabSTr[sizeTabR];
    		int tabSTl[sizeTabR];
     
     
    		//ajout au hasard des séquences dans les tableaux contenant les séquences dans le sous arbre
    		int r=0;
    		int l=0;
    		for(int i=0; i<nbSeqByST; i++){
    			int a=random(0,2);
    			if(a==0 && l<sizeTabL){
    				tabSTl[l]=tabSeq[i];
    				l++;
    			}
    			else{
    				if(r<sizeTabR){
    					tabSTr[r]=tabSeq[i];
    					r++;
    				}
    				else{
    					tabSTl[l]=tabSeq[i];
    					l++;
    				}
    			}
    		}
     
     
    		//initialisation noeud père
     
     
    		fullTreeInit(elt->STl, depthTreeCurrent+1, randDepth, leaves, sizeTabL, tabSTl, aligt, 1, elt);
    		fullTreeInit(elt->STr, depthTreeCurrent+1, randDepth, leaves, sizeTabR, tabSTr, aligt, 1, elt);
    	}
    }
    j'ai fais une recherche avec Valgrind mais je ne comprends pas où est l'erreur.

    Stack overflow in thread 1: can't grow stack to 0x7fe801fe0
    ==5376==
    ==5376== Process terminating with default action of signal 11 (SIGSEGV)
    ==5376== Access not within mapped region at address 0x7FE801FE0
    ==5376== at 0x4C28AEA: operator new(unsigned long) (vg_replace_malloc.c:261)
    ==5376== If you believe this happened as a result of a stack
    ==5376== overflow in your program's main thread (unlikely but
    ==5376== possible), you can try to increase the size of the
    ==5376== main thread stack using the --main-stacksize= flag.
    ==5376== The main thread stack size used in this run was 8388608.
    ==5376== Stack overflow in thread 1: can't grow stack to 0x7fe801fd8
    ==5376==
    ==5376== Process terminating with default action of signal 11 (SIGSEGV)
    ==5376== Access not within mapped region at address 0x7FE801FD8
    ==5376== at 0x4A2359C: _vgnU_freeres (vg_preloaded.c:58)
    ==5376== If you believe this happened as a result of a stack
    ==5376== overflow in your program's main thread (unlikely but
    ==5376== possible), you can try to increase the size of the
    ==5376== main thread stack using the --main-stacksize= flag.
    ==5376== The main thread stack size used in this run was 8388608.
    ==5376==
    ==5376== HEAP SUMMARY:
    ==5376== in use at exit: 53,344,335 bytes in 213,176 blocks
    ==5376== total heap usage: 222,618 allocs, 9,442 frees, 54,204,936 bytes allocated
    ==5376==
    ==5376== LEAK SUMMARY:
    ==5376== definitely lost: 0 bytes in 0 blocks
    ==5376== indirectly lost: 0 bytes in 0 blocks
    ==5376== possibly lost: 2,407 bytes in 45 blocks
    ==5376== still reachable: 53,341,928 bytes in 213,131 blocks
    ==5376== suppressed: 0 bytes in 0 blocks
    ==5376== Rerun with --leak-check=full to see details of leaked memory
    ==5376==
    ==5376== For counts of detected and suppressed errors, rerun with: -v
    ==5376== Use --track-origins=yes to see where uninitialised values come from
    ==5376== ERROR SUMMARY: 12902 errors from 7 contexts (suppressed: 4 from 4)
    Erreur de segmentation
    Est ce que quelqu'un peut m'aider?

    Merci

    Alaninho

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Par défaut
    Salut!

    Alors j'ai regardé rapidement les messages d'erreurs. A priori tu essaye d'accéder à une zone mémoire qui n'a pas été allouée.

    Je n'ai pas encore regardé ton code dans le détails. Mais tu peux peut être rajouter des tests te permettant de voir si tes pointeurs ne sont pas à NULL avant de les utiliser. C'est une première piste de recherche.

    Après, lorsque tu copie des pointeurs d'objets je te conseil d'utiliser des constructeurs par recopie prenant en paramètre le pointeur vers l'objets à copier.

    As-tu essayé de faire du pas-à-pas à l’exécution pour isoler les lignes qui posent problème ?

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    C’est quoi la définition de Element, et notamment de tabSequenceInST ?

    C’est un bon candidat : tu écris dedans, il n’est jamais alloué.

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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