Bonjour,

Un petit bout de code vaut mieux qu'un long discours alors c'est parti! :

Ma classe de liste et ses itérateurs (j'adore réinventer la roue...)
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
template<typename T>
        struct List
        {
            /// Data
                T        Data;
                List<T>* Next;
                List<T>* Previous;
 
            /// Iterators
                struct Iterator
                {
                    private :
                        List<T>* l;
                    public :
                        Iterator(void)  {l = NULL;}
 
                        Iterator(List<T>* _l) {l = _l;}
 
                        Iterator(List<T>& _l) {l = &(_l);}
 
                        bool isNull(void) {return l==NULL;}
 
                        void next(void)
                        {
                            if(l!=NULL)
                                l = l->Next;
                        }
 
                        void previous(void)
                        {
                            if(l!=NULL)
                                l = l->Previous;
                        }
 
                        void push(const T& dat)
                        {
                            if(l!=NULL)
                                l->push(dat);
                        }
 
                        void pushAndMove(const T& dat)
                        {
                            if(l!=NULL)
                            {
                                while(l->Next!=NULL) l = l->Next; //go to the end
 
                                l->push(dat); // push element
 
                                l = l->Next; // move to it
                            }
                            else
                                std::cout << "accessing NULL data" << std::endl;
                        }
                };
 
            /// Constructors
                List(void) : Data()
                {
                    Next = NULL;
                    Previous = NULL;
                }
 
                List(const T& data, List<T>* prev = NULL, List<T>* next = NULL) : Data(data)
                {
                    Next     = next;
                    Previous = prev;
                }
 
                ~List(void)
                {
                    if(Next!=NULL)
                    {
                        Next->Previous = NULL; //eviter de revenir sur cet élément (this)
                        delete Next;
                    }
                    if(Previous!=NULL)
                    {
                        Previous->Next = NULL;  //eviter de revenir sur cet élément (this)
                        delete Previous;
                    }
                }
 
            /// Methods
                void push(const T& data)
                {
                    List<T>* it = this;
 
                    while(it->Next!=NULL) it = it->Next; //tant qu'il y a du monde derrière
 
                    it->Next = new List<T>(data, it, NULL);
                }
    };
et le code qui fait tout planter... (un joli Segmentation Fault apparaît après "done" et avant la fin du programme...)
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
 
int main()
{
    List<std::string>* mylist = new List<std::string>;
    List<std::string>::Iterator it(mylist);
 
     mylist->Data = "Hello World";
 
     for(unsigned int i = 0; i<1000000; i++)
         it.pushAndMove("a b c d");
 
     std::cout << "done" << std::endl;
 
     delete mylist;
 
     return 0;
}
gdb me trouve un SIGSEGV sur la ligne de delete dans le cas de Next!=NULL du destructeur ~List.



Merci pour votre aide,

PS : Petite indication : ce code se déroule bien pour 104822 éléments mais pas pour un de plus...