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