Обновление:
Я пропустил ваш код через AppVerifier .И изначально ничего не нашел, пока я не попробовал разные варианты сборок Debug / Release x86 / x64.И однажды я получил его, чтобы он рухнул в Windows.И тогда это прекратило упрекать катастрофу.Затем я изменил все ваши начальные операторы tree->insert
, чтобы они взяли значение rand()
вместо фиксированного значения, и я мог заставить его работать в Windows 100% времени.Я не уверен, что мне нужно событие AppVerifier, но я оставил его включенным.Именно тогда я заметил, что ваш деструктор LinkedList пытался удалить указатель на 0xcccccccc, который является неинициализированной памятью в отладочной сборке.
Итог, вот ваша ошибка:
Ваш LinkedListКонструктор копирования не инициализирует указатель заголовка в NULL
Также у вас есть два конструктора копирования.Тот, который принимает неконстантную ссылку и является публичным.И еще один (с немного другим поведением), который принимает ссылку на const, но является закрытой.
Вам нужен только один конструктор копирования, который является общедоступным и принимает ссылку на const.
Вотисправить.Пусть это будет открытый конструктор:
LinkedList::LinkedList(const LinkedList& other) {
length = 0;
head = NULL; // YOU FORGOT THIS LINE
Node* tmp = other.head;
while (tmp != NULL)
{
this->addToTail(tmp->data);
tmp = tmp->next;
}
length = other.length;
}
А затем удалите другой экземпляр конструктора копирования LinkedList.
Еще одна вещь, которая выглядит подозрительно.Ваш конструктор btree, который принимает связанный список, портит ваш список. Это также забывает инициализировать объект перед попыткой первой вставки.
btree::btree(LinkedList &list)
{
while (list.head != NULL)
{
insert(list.head->data);
list.head = list.head->next;
}
}
Это совершенно неправильно.Когда вы создаете btree из списка ( передается через ссылку ), конструктор изменит переданный в экземпляре LinkedList.Когда этот конструктор вернется, экземпляр list
будет возвращен вызову с нулевым указателем на голову, но с ненулевой длиной, когда функция вернется. И ваш деструктор LinkedList не сможет обработать дерево для освобожденияобъем памяти.Таким образом, у вас есть утечка памяти и недопустимое состояние объекта.
Сделайте это вместо этого.
btree::btree(const LinkedList &list)
{
root = NULL;
isMirrored = false;
Node* tmp = list.head;
while (tmp != NULL)
{
insert(tmp->data);
tmp = tmp->next;
}
}
Также лучше использовать списки инициализатора с конструкторами:
btree::btree(const LinkedList &list) :
root(NULL),
isMirrored(false)
{
...
}
Добро пожаловать:)
old stuff:
В ваших операторах cout
отсутствует маркер конца строки (который сбрасывает вывод):
Вместо таких утверждений, как это:
cout << *tree;
Сделайте это:
cout << *tree << endl;
Но это не ваша проблема.В вашей программе произошел сбой:
[ec2-user@ip-172-31-10-108 stackover]$ g++ main.cpp btree.cpp LinkedList.cpp
[ec2-user@ip-172-31-10-108 stackover]$ ./a.out
List: (10,)
List: (14,6,)
List: (16,12,8,5,)
Tree: 5,6,8,10,12,14,16,
Tree: 16,14,12,10,8,6,5,
Segmentation fault
Похоже, у нас есть ошибка, которая приводит к сбою.Давайте скомпилируем с помощью отладочной сборки и проанализируем:
[ec2-user@ip-172-31-10-108 stackover]$ g++ main.cpp btree.cpp LinkedList.cpp -g
[ec2-user@ip-172-31-10-108 stackover]$ gdb ./a.out
GNU gdb (GDB) Amazon Linux (7.6.1-64.33.amzn1)
...
Reading symbols from /home/ec2-user/stackover/a.out...done.
(gdb) run
Starting program: /home/ec2-user/stackover/./a.out
Missing separate debuginfo for /usr/lib64/libstdc++.so.6
Try: yum --enablerepo='*debug*' install /usr/lib/debug/.build-id/87/91ddd49348603cd50b74652c5b25354d8fd06e.debug
Missing separate debuginfo for /lib64/libgcc_s.so.1
Try: yum --enablerepo='*debug*' install /usr/lib/debug/.build-id/a0/3c9a80e995ed5f43077ab754a258fa0e34c3cd.debug
List: (10,)
List: (14,6,)
List: (16,12,8,5,)
Tree: 5,6,8,10,12,14,16,
Tree: 16,14,12,10,8,6,5,
Program received signal SIGSEGV, Segmentation fault.
0x00000000004011b5 in btree::mirrorInsert (this=0x614ea0, tmp=0x21, key=16) at btree.cpp:133
133 if (tmp->key_value <= key)
Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.173.amzn1.x86_64
(gdb)
Краткий ответ: похоже, у вас есть дополнительная отладка для выполнения строки 133 файла btree.cpp.Значение tmp
имеет значение 0x21, что, вероятно, не является допустимым значением указателя.