0

所以我刚刚完成了合并排序的实现,但我突然想到我没有删除从我丢弃的递归调用返回的内存,所以我为 array1 和 array2 添加了删除语句,然后突然我的合并排序没有工作.....为什么在我的函数末尾添加删除语句会搞砸一切?我需要释放内存吗?

代码如下:

/**
 * 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;
}
4

2 回答 2

3

当数组大小等于 2 时,我看到一个问题,因为您调用

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

和 size1=1,size2=1 那么这两个调用都将返回,并且您将在变量中具有以下值

array1 = array;
array2 = array+1;

并且 array2 不是分配的内存地址,因此删除它应该会失败并出现错误或执行未定义的操作,所以我建议在继续之前修复它

于 2012-08-07T04:42:31.863 回答
1

我没有详细查看,但想到一件事:当mergeSort使用大小为的数组调用时,<= 1它返回传递的数组而不分配新的数组,但是从递归调用返回时,无论如何你都会尝试删除它。您可以通过添加以下内容来改进您的代码:

if (size1 > 1)
   delete [] array1;
if (size2 > 1)
   delete [] array2;
于 2012-08-07T04:54:31.597 回答