Конструктор копирования вызывается на неверном объекте - PullRequest
2 голосов
/ 28 сентября 2010

В настоящее время я реализую конструктор копирования для класса Linked List.Когда я создаю новый экземпляр класса с другим связанным списком в качестве параметра, вызывается конструктор для объекта, который я передаю в качестве параметра.Это оставляет меня в замешательстве за пределами веры.Вот раздел, необходимый для понимания того, что происходит в методе main:

int main()
{
   LinkedList ll;
   LinkedList ll2(ll);
}

Таким образом, вместо вызова конструктора копирования для ll2 вызывается конструктор копирования для ll.Я подтвердил, что размер ll правильно равен 3, прежде чем я попытаюсь скопировать ll в новый LinkedList, а именно ll2.После того как копии имеют одинаковый размер, больше 3, но еще более странный, вызывается конструктор копирования из ll, а не из ll2.Поскольку я использую VC ++, я прошел программу, чтобы подтвердить это.

Вот конструктор копирования для класса LinkedList:

LinkedList::LinkedList(const LinkedList & other)        
{
   LLNode *otherCurNode = other.GetFirst();
   if (otherCurNode != NULL)
   {
      front = new LLNode(otherCurNode->GetValue(), NULL, NULL);
      back = front;
   }
   else
   {
      front = NULL;
      back = NULL;
   }
   LLNode *curNode = front;
   while (otherCurNode != NULL)
   {
      Insert(otherCurNode->GetValue(), curNode);
      curNode = curNode->GetNext();
      otherCurNode = otherCurNode->GetNext();
      back = curNode;
   }
   numNodes = other.GetSize();
}   

Приношу свои извинения, если это закончитсяпростая проблема - я довольно плохо знаком с C ++.Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

7 голосов
/ 28 сентября 2010
LinkedList ll = LinkedList();

Это создает экземпляр связанного списка, и этот экземпляр затем копируется.Это похоже на Java или C # -изм.Фактически это эквивалентно:

LinkedList ll(LinkedList());

Чтобы создать пустой связанный список, просто напишите:

LinkedList ll;

Это будет неявно вызывать конструктор по умолчанию.убедитесь, что у вас есть конструктор по умолчанию, который правильно инициализирует связанный список как пустой.Если у вас его нет, переменные списка получат все значения мусора в стеке.

2 голосов
/ 28 сентября 2010

Странные вещи часто являются признаком неправильной обработки памяти.Я вижу одну непосредственную проблему с кодом, который вы разместили, и могут быть аналогичные проблемы в других функциях.

В строке while (otherCurNode->GetNext() != NULL) могут произойти плохие вещи, если otherCurNode уже NULL.Это тот случай, когда другой список пуст, а также когда вы достигаете конца списка через otherCurNode = otherCurNode->GetNext();.Вы действительно хотите сделать это while (otherCurNode != NULL).

1 голос
/ 28 сентября 2010

Таким образом, вместо вызова конструктора копирования для ll2 вызывается конструктор копирования для ll, и для ll2 устанавливается та же ссылка, что и для ll.

Вы можете сделатьуверен, что это не то, что происходит.Ваши переменные ll и ll2 (кстати, вы можете понять, почему использование строчных букв l в коротких именах никогда не является хорошей идеей) размещаются в стеке, они не являются ссылками.Чтобы увидеть это, откройте Quick Watch, пока обе переменные находятся в области видимости, и введите &ll, а затем &ll2.Вы увидите, что у них разные адреса.

Как выглядят ваш конструктор по умолчанию и оператор присваивания?Есть ли другие конструкторы?Любые другие места, где вы назначаете front переменную экземпляра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...