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...)
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
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); } };
gdb me trouve un SIGSEGV sur la ligne de delete dans le cas de Next!=NULL du destructeur ~List.
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; }
Merci pour votre aide,
PS : Petite indication : ce code se déroule bien pour 104822 éléments mais pas pour un de plus...
Partager