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 à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    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 à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    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 à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    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 actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    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 à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 11
    Points
    11
    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 actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    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