Почему эта функция сортировки слиянием возвращает связанный список с нулями (c ++)?

У меня есть эта функция сортировки слиянием

namespace sorted{

template<typename T>
class list {

/* other stuff */

list<T>* slice(int from, int to){
from = (from < 0) ? 0 : from;
to = (to > this->len) ? this->len : to;
list<T>* result = new list<T>();
node<T> *n = this->head;
int idx = 0;
while (n && (idx < this->len)){
if ((from <= idx) && (idx <= to)) result->append(n->value);
if (idx > to) break;
n = n->next;
idx++;
}
return result;
}
}

template<typename T>
list<T>* merge(list<T>* left, list<T>* right){
list<T>* result = new list<T>();
while ((left->length() > 0) || (right->length() > 0)){
if ((left->length() > 0) && (right->length() > 0)){
T l = left->get(0);
T r = right->get(0);
if (l <= r){
result->append(l);
left->remove(0);
} else{
result->append(r);
right->remove(0);
}
continue;
}

if (left->length() > 0) {
result->append(left->get(0));
left->remove(0);
}

if (right->length() > 0) {
result->append(right->get(0));
right->remove(0);
}
}
return result;
}

template<typename T>
list<T>* merge_sort(list<T>* original){
if (original->length() <= 1) {
return original;
}
int len = original->length();
list<T>* left = NULL;
list<T>* right = NULL;
if (len > 2){
left = original->slice(0,(len/2));
right = original->slice((len/2)+1,len-1);
}else if (len == 2){
left = original->slice(0,0);
right = original->slice(1,1);
}
left = merge_sort(left);
right = merge_sort(right);
delete original;
list<T>* result = merge(left, right);
delete left;
delete right;
return result;
}

/* other stuff */
}

И вот мой основной метод

int main(int argc, char** argv){
sorted::list<int>* l = get_random_list();
l = merge_sort(l);
for (int i = 0; i < (l->length() - 1); i++){
int t = l->get(i);
int u = l->get(i+1);
if (t > u){
sorted::list<int>* m = l->slice(i - 5, i + 5);
cout << m << endl;
delete m;
break;
}
}
delete l;
return 0;
}

Ссылка на проект bitbucket.org

Мой вопрос было этот.

Если список правильно возвращается из функции среза, почему он не будет возвращен основной функции должным образом, если он выполняется таким же образом?

[Обновить] Добавлены функции, так как они в настоящее время функционируют так, как они должны быть. Полная версия находится на Bitbucket.

1

Решение

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

Теперь происходит то, что в назначениях списков будет использоваться оператор присваивания по умолчанию, который автоматически генерируется компилятором. Это делает мелкий копировать, поэтому список в левой части назначения будет иметь те же указатели, что и для списка в правой части. Это означает, что когда локальная переменная, которую вы возвращаете, выходит из области видимости, она, конечно, вызывает деструктор, который удаляет списки. Теперь копия имеет указатели, которые указывают на удаленную память, и доступ к этим указателям является неопределенным поведением. Вот почему, кажется, работает в одном месте, а не в другом.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]