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