Problème : std::string et Segfault
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:
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:
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.
:aie:
Merci pour votre aide,
PS : Petite indication : ce code se déroule bien pour 104822 éléments mais pas pour un de plus...