2012-08-07 6 views
0

Итак, я только что закончил реализацию сортировки слияния, но мне пришло в голову, что я не удалял память, возвращаемую из рекурсивных вызовов, которые я отбрасывал, поэтому я добавил инструкции delete для array1 и array2, а затем вдруг мой сортировка слияния doesn Не работает ..... Почему добавление операторов удаления ближе к концу моей функции все испортило? Нужно ли мне освобождать память?Удалить Память выделена в другой функции?

Код ниже:

/** 
* Runs merge sort on this ArrayList<T>. Interface function to the central, 
* recursive, merge sort function. 
*/ 
template<class T> 
void ArrayList<T>::mergeSort() { 

    T* temp = mergeSort(array, size); 
    delete [] array; 
    array = temp; 
} 

/** 
* Runs merge sort on the passed in array. Recursive. 
* 
* @param array the array to sort. 
* @param arraySize the size of the array that is to be sorted. 
* @return the sorted array. 
*/ 
template<class T> 
T* ArrayList<T>::mergeSort(T* array, int arraySize) { 

    T* returnArray = array; 

    //If the array is more than one element. 
    if (arraySize > 1) { 

     int size1 = arraySize/2; 
     int size2 = arraySize - size1; 

     T* array1; 
     T* array2; 

     //Recurse. 
     array1 = mergeSort(array, size1); 
     array2 = mergeSort(array + size1, size2); 

     returnArray = new T[arraySize]; 

     //Loop through all elements in returnArray. 
     int i = 0, j = 0, k = 0; 
     while (i < arraySize) { 

      //Place the lesser of two elements in returnArray. 
      if ((array1[j] <= array2[k] && j < size1) 
        || k == size2) { 

       returnArray[i] = array1[j]; 
       j++; 
      } 
      else { 

      returnArray[i] = array2[k]; 
       k++; 
      } 

      i++; 
     } 

/--- таковы удалений РЕЧЬ !! -----/

 delete [] array1; 
     delete [] array2; 
    } 

    return returnArray; 
} 
+0

Когда вы говорите: «внезапно мой сортировка слияния не работает», что вы имеете в виду? Это крушение? Производит ли он неправильные результаты? Что-то другое? Вы должны быть более конкретными и сообщать нам какие-либо конкретные сообщения об ошибках, которые вы видите. – user1118321

+0

Не была указана конкретная ошибка, я запускаю ее, она падает ... довольно внезапно;) – Ethan

ответ

3

я вижу проблему, когда размер массива равен до 2 , так как вы называете

array1 = mergeSort(array, size1); 
array2 = mergeSort(array + size1, size2); 

и size1 = 1, size2 = 1 то оба этих са LLS вернется, и вы будете иметь следующие значения переменных

array1 = array; 
array2 = array+1; 

и array2 не выделенный адрес памяти, так его удаление должно произойти сбой с ошибкой или сделать что-то неопределенное, так что я хотел бы предложить фиксируя, что, прежде чем продолжить

+0

awesome! Это исправило это! Спасибо за помощь! – Ethan

1

Я не просмотрел полностью подробно, но возникает одна вещь: когда mergeSort вызывается с массивом, размер которого равен <= 1, он возвращает переданный массив без выделения нового, но после возврата из рекурсивного вызова вы попытаетесь удалять его в любом случае. Вы можете улучшить свой код, добавив:

if (size1 > 1) 
    delete [] array1; 
if (size2 > 1) 
    delete [] array2; 
Смежные вопросы