2013-05-07 2 views
0

У меня есть связанный список. Она включает в себя конструктор копирования:переполнение в скопированной версии связанного списка

LinkedListStorage(const LinkedListStorage &other) :root(NULL) 
{ 
    size = other.size; 
    count = other.count; 
    node *cur = other.root; 
    node *end = NULL; 

    while(cur->next != NULL) 
    { 
     node* x = new node; 
     x->word = cur->word; 

     if(!root) 
     { 
      root = x; 
      end = root; 
     } 
     else 
     { 
      end->next = x; 
      end = x; 
     } 

     cur = cur->next; 
    } 
} 

В классе я запустить его через метод, чтобы написать связный список в файл, однако в то время как указанный способ работает для первоначального списка, скопированная версия списка вызывает доступ нарушение, перешагнув список, конечная запись в список, поскольку она скопирована, указывает на 0x00000000, как ожидалось, однако к моменту, когда она попадает в функцию записи, указатель для последнего узла заканчивается, указывая на 0xcdcdcdcd, никакой код не выполняется между попыткой копировать и использовать функцию записи, поэтому он должен быть конструктором копирования, однако я не могу на всю жизнь понять, где он идет не так.

Заранее благодарим за помощь!

+0

0xcdcdcdcd обычно означает неинициализированный valiable – spiritwolfform

+0

Трудно сказать, не видя остальную часть класса, но, может быть, вам нужно initialize 'x-> next', то есть' node * x = новый узел; x-> word = cur-> word; x-> next = NULL; ' – john

+0

@John. Вы были правы, установив x-> next = cur->. Затем исправлена ​​проблема, из-за этого он не инициализировал -> следующий из конечного элемента. Большое спасибо! Тем не менее, это не ответ, так что я должен делать с выбором правильного ответа? –

ответ

1

Трудно сказать, не видя остальную часть класса, но, возможно, вам необходимо инициализировать x->next, т.е.

node* x = new node; 
x->word = cur->word; 
x->next = NULL; 
1

Я думаю, проблема в том, что вы не копируете последний элемент. Изменение:

while(cur->next != NULL) 

в

while(cur != NULL) 
1

Вы сохраняете указатель на последнюю запись в списке в end, но при переборе по списку вы проверить ->next != NULL, которые не кажутся вам быть настройки на end. Я не уверен, что это то, что вызывает вашу текущую проблему, но кажется неправильным. :)

Edit: Поскольку вы также сохранить длину списка в count у вас есть тройной избыточная информация:

  1. end
  2. ->next == NULL
  3. count Вы должны быть осторожны держите их в синхронизации, если вам действительно нужны все они.

Также: вы должны использовать nullptr вместо NULL, если можете.