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 :

Erreure � l'execution, invalid Pointer


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Par d�faut Erreure � l'execution, invalid Pointer
    Bonjour,

    j'obtiens une erreur lors de l'ex�cution de mon programme que j'ai du mal � comprendre.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    *** glibc detected *** /chemin/vers/executable: munmap_chunk(): invalid pointer: 0xb1e0a8b0 ***
    en fait ce qui m'�tonne c'est que cet erreur ce produit juste apr�s l'appel d'une fonction1 dans une fonction2. si je fait le traitement de fonction1 directement dans fonction2 je n'ai pas l'erreur. j'ai v�rifier l'adresse de tous les �l�ments envoy�s � ma fonction en param�tre et aucune ne correspond au pointer d�sign� comme invalid.

    d'ailleur voici le corp de la fonction :
    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
    112
    void
    FindHole(ImageType::Pointer image, ImageType::RegionType region, int direction)
    {
        std::cout<<"&&&&&&&&&&&&&&&&&FIND HOLE&&&&&&&&&&&&&&"<<std::endl;
        std::cout<<image<<std::endl;
        LinearConstIteratorType lcoit(image, region);
        lcoit.SetDirection(direction);
     
        //a vector which contains vectors for the coef slop of the intensity profile
        std::vector <std::vector<float> > vect_vect_coefSlop;
        //a vector which contains vectors for the position of the extrema
        std::vector <std::vector<int> > vect_vect_extremaPosition;
     
        //for each line
        for (lcoit.GoToBegin(); !lcoit.IsAtEnd(); lcoit.NextLine())
        {
            //create vector for intensity profile, derive extrema position, and coefSlop
            std::vector <unsigned short> vect_intensite;
            std::vector < short> vect_derive;
            std::vector <int> vect_extremaPosition;
            std::vector <float> vect_coefSlop;
            //for each pixel of the current line
            while ( !lcoit.IsAtEndOfLine() )
            {
                //collect the intensity of the current pixel
                vect_intensite.push_back(lcoit.Get());
                ++lcoit;
            }
     
            //then from the seconde to the penultimate intensity pix
            for (int i=1; i<vect_intensite.size()-1; ++i)
            {
                //calculate derive
                vect_derive.push_back(vect_intensite[i+1]-vect_intensite[i-1]);
            }
            //then for each derive
            bool old_signe = true;
            if (vect_derive[0]<0) old_signe = false;
            for (int j = 1; j<vect_derive.size(); ++j)
            {
                bool signe;
                //explore signe and update old_signe
                if (vect_derive[j] < 0)
                {
                    signe = false;
                }
                else
                {
                    signe = true;
                }
                //if we have a change of slop signe
                if (old_signe != signe )
                {
     
                    vect_extremaPosition.push_back(j);
                    //std::cout<<"extrema position at line : "<<l<<", column : "<<j<<std::endl;
                }
                old_signe = signe;
            }
     
            for (int k = 1; k<vect_extremaPosition.size(); ++k)
            {
     
                int currentCol = vect_extremaPosition[k];
                int oldCol = vect_extremaPosition[k-1];
     
                float coefSlop = (vect_intensite[currentCol] - vect_intensite[oldCol])/(currentCol-oldCol+0.0) ;
                vect_coefSlop.push_back(coefSlop);
                //std::cout<<"coef slop : "<<coefSlop<<std::endl;
            }
            //hold the coefSlop and the extrema position for each lines
            vect_vect_coefSlop.push_back(vect_coefSlop);
            vect_vect_extremaPosition.push_back(vect_extremaPosition);
        }
     
        //for each lines
        float coefSlopValue_old = 0;
        int bestLine = 0;
        for (int l = 0; l < vect_vect_coefSlop.size(); ++l)
        {
            //for each column
            int count = 0;
            float coefSlopValue = 0;
            for (int c = 0; c <vect_vect_coefSlop[l].size(); ++c)
            {
                //if we have a coeficient <-20 between 2 extrema the first one is a max wich point on a hole !!
                if (vect_vect_coefSlop[l][c] < -20)
                {
                    ++count;
                    coefSlopValue += vect_vect_coefSlop[l][c];
                }
                else
                {
                    vect_vect_coefSlop[l].erase(vect_vect_coefSlop[l].begin() + c-1);
                    vect_vect_extremaPosition[l].erase(vect_vect_extremaPosition[l].begin() + c-1);
                }
                if (count == 4)
                {
                    //std::cout<<"4 aligned hole!"<<std::endl;
                    coefSlopValue /= 4;
                    //std::cout<<"coefSlopValue : "<<coefSlopValue<<std::endl;
                    if  (coefSlopValue < coefSlopValue_old)
                    {
                        coefSlopValue_old = coefSlopValue;
                        bestLine = l;
                        std::cout<<"best 4 aligned hole at line : "<<l<<std::endl;
                    }
                }
            }
        }
        std::cout<<"&&&&&&&&&&&&&&&&&FIND HOLE DONE&&&&&&&&&&&&&&"<<std::endl;
    }
    image est un smartPointer de la librairie itk

    (je travail avec l'EDI code::blocks et le compilateur gcc)
    GDB me dit que la derni�re fonction (de mon programme) appel�e est bien FindHole.

    Si vous avez une id�e, sur ce qui peut �tre la cause de ce genre d'erreurs, votre avis m'int�resse.
    Bonne journ�e.
    rp

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Ce qu'il faudrait voir, c'est l'endroit o� cette fonction est appel�e, et v�rifier que le pointeur transmis en premier argument corresponde bel et bien � l'adresse d'un objet correct et valide (qu'il existe bien et qu'il n'a pas �t� d�truit )

    Il n'est pas impossible que tu doives remonter au niveau de la pile d'appel pour t'assurer que l'objet en question n'est effectivement jamais d�truit

    Pour t'en assurer, je te conseillerais de trouver la premi�re fonction ex�cut�e qui occasionne (�ventuellement) l'appel � ta fonction FindHole dans laquelle l'adresse sur laquelle pointe le pointeur est d�finis, puis de mettre un break point au niveau du destructeur de la classe, ainsi qu'un autre dans la fonction FindHole ...

    Si tu t'arr�te au niveau du destructeur avant que la fonction ne soit effectivement appel�e, tu auras tr�s certainement fait un pas de g�ant dans la r�solution de ton probl�me
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Par d�faut
    Salut Koala01.

    merci de t'int�resser a mon probl�me. Je pense comprendre ce que tu veux m'expliquer, et l'avoir d�jas v�rifier. (je n'ai pas une grande experience du debogage tu l'a peut �tre senti ). je n'arrive pas � correctement utiliser GDB apparament car les libraire que j'utilise n'ont pas �t� compiler en mode debug lors de l'installation. du coup GDB ne veux pas me dire la ligne qui � provoquer l'erreure dans mes fonction qui utilise ces librairies,

    d'un autre cot� il ne veux pas non plus s'arreter � mes breakpoint (m�me dans le main par exemple) , je comprend pas j'ai pourtant bien activ� l'option -g dans mes Build's option et je suis bien en mode debug (avec code::blocks).

    bon en attendant que je trouve une solution � ce probl�me, j'�saye de me d�brouiller avec des cout.
    voici l'appel de ma fonction FindHole :

    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
     
    //R because it is resampled
        ImageType::Pointer imageR = reader->GetOutput();
     
        //process intensity profile
        std::cout<<"processing intensity profile  : "<<std::endl;
     
        //create  a region just for the object of interest.
        start[0] = 0;
        start[1] = 0;
        size[0] =floor((imageR->GetLargestPossibleRegion().GetSize()[0])*1/3);
        size[1] =imageR->GetLargestPossibleRegion().GetSize()[1];
        region.SetSize( size );
        region.SetIndex( start );
        std::cout<<"region start : ["<<start[0]<<"] ["<<start[1]<<"]"<<std::endl;
        std::cout<<"region end : ["<<start[0]+size[0]<<"] ["<<start[1]+size[1]<<"]"<<std::endl;
        std::cout<<imageR<<std::endl;
        FindHole(imageR, region, 0);
    std::cout<<"//////////High-Contrast :: measure on AX T1 slice 1 :: Done\\\\\\\\\\\\\\\\\\\\"<<std::endl;
    }
    comme tu peux le voir j'ai afficher mon pointer vers mon image avant et � l'interieur de la fonction FindHole.

    dans les deux cas j'obtient dans la console :
    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
     
    Image (0xb0d09ef0)
      RTTI typeinfo:   itk::Image<unsigned short, 2u>
      Reference Count: 5
      Modified Time: 6202
      Debug: Off
      Observers: 
        none
      Source: (0xb0d04d50) 
      Source output name: Primary
      Release Data: Off
      Data Released: False
      Global Release Data: Off
      PipelineMTime: 6067
      UpdateMTime: 6203
      RealTimeStamp: 0 seconds 
      LargestPossibleRegion: 
        Dimension: 2
        Index: [0, 0]
        Size: [584, 272]
      BufferedRegion: 
        Dimension: 2
        Index: [0, 0]
        Size: [584, 272]
      RequestedRegion: 
        Dimension: 2
        Index: [0, 0]
        Size: [584, 272]
      Spacing: [0.12207, 0.12207]
      Origin: [0, 0]
      Direction: 
    1 0
    0 1
     
      IndexToPointMatrix: 
      0.12207 0
    0 0.12207
     
      PointToIndexMatrix: 
      8.192 0
    0 8.192
     
      Inverse Direction: 
      1 0
    0 1
     
      PixelContainer: 
        ImportImageContainer (0xb0d07ae0)
          RTTI typeinfo:   itk::ImportImageContainer<unsigned long, unsigned short>
          Reference Count: 1
          Modified Time: 6200
          Debug: Off
          Observers: 
            none
          Pointer: 0xb2f7fe48
          Container manages memory: true
    les seule diff�rence �tant Modified Time (logique) et reference count, qui est incr�menter de 1 lors de l'appel de la fonction (encore logique puisqu'on le recopie non ?).

    du coup je n'ai pas l'impression que le probl�me vienne de mon smart pointer, mon intuition me fait plut�t soupsonner un de mes vector. (mais c'est du feeling total )

    Je pr�cise Que toute les lignes de FindHole sont �x�cuter, en tous cas tous les cout mais pas le cout juste apr�s son appelle.
    voila, j'esp�re que �a ne fait pas trop de chose d'un coup, en tous les cas encore merci pour ton aide.

    Bonne journ�e,
    rp

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Par d�faut
    Ok, en commentant certaines lignes de ma fonction j'ai pu trouver les lignes coupables:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    vect_vect_coefSlop[l].erase(vect_vect_coefSlop[l].begin() + c-1);
    vect_vect_extremaPosition[l].erase(vect_vect_extremaPosition[l].begin() + c-1);
    je ne vois pas trop ce qui cloche (ces deux lignes fonctionne parfaitement en dehors du corps de ma fonction)

    encore merci koala01.

  5. #5
    Membre exp�riment� Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    D�cembre 2005
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Amateur

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 170
    Par d�faut
    Ya pas mal de choses qui peuvent merder dans ces deux lignes.
    As tu bien 2 �l�ments dans vect_vect_coefSlop ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    vect_vect_coefSlop[l].begin() + c-1
    as tu bien suffisamment d'�l�ments dans vect_vect_coefSlop[1] ?

    D'une mani�re g�n�rale, et sans comprendre le sens de ton programme, c'est assez crade d'utiliser des indices entiers dans la STL. C'est pr�vu par simplicit�, mais les algos doivent �tre faits en utilisant des it�rateurs autant que possible. Plutot que de r�cup�rer syst�matiquement un �l�ment d'un vecteur par indice, r�cup�re le une fois et gardes une r�f�rence. Maintenant suivant l'algos des fois on peut pas faire autrement. Mais d�j� essaies de limiter au maximum les appels a des [] et autres +int des it�rateurs, c'est des nids � probl�mes.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Par d�faut
    C'est vrai que ce que j'ai fait n'�tait pas tr�s propre et effectivement le probl�me apparaissait car j'�ssayait de supprimer un �l�ment qui n'�xistait pas (encore). maintenant que j'ai pu verifier que mon programme avait le comportement attendut je vais suivre ton conseil et le r��crire en utilisant des it�rateurs. (j'aurait dailleur du commencer par l� �a m'aurait fait gagner du temps au final ).

    merci pour les conseils.

  7. #7
    Membre exp�riment� Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    D�cembre 2005
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Amateur

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 170
    Par d�faut
    Citation Envoy� par ren�paul Voir le message
    j'aurait dailleur du commencer par l� �a m'aurait fait gagner du temps au final
    C'est un peu une autre fa�on de concevoir les algos, mais une fois habitu�, ca permet des possibilit�s d'�crire les algos de mani�re plus simple et plus clair.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 27/05/2009, 13h57
  2. [ERREUR D'EXECUTION] Segmentation Fault
    Par CestPasMoi dans le forum C++
    R�ponses: 3
    Dernier message: 26/11/2005, 17h38
  3. R�ponses: 3
    Dernier message: 03/11/2005, 18h41
  4. [LDAP][Interface Winldap.h] Erreur d'execution
    Par -=Spoon=- dans le forum Autres SGBD
    R�ponses: 2
    Dernier message: 10/03/2005, 17h10
  5. [javamail] erreur d'execution
    Par bibx dans le forum API standards et tierces
    R�ponses: 11
    Dernier message: 05/12/2003, 11h04

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