【问题标题】:Delete Memory allocated in another function?删除在另一个函数中分配的内存?
【发布时间】:2012-08-04 01:47:18
【问题描述】:

所以我刚刚完成了合并排序的实现,但我突然想到我没有删除从递归调用返回的内存被我丢弃,所以我为 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;
}

【问题讨论】:

  • 当你说“突然我的归并排序不起作用”时,你是什么意思?它会崩溃吗?它会产生不正确的结果吗?还有什么?您需要更加具体,并告诉我们您看到的任何具体错误消息。
  • 没有给出具体错误,我运行它,它崩溃了......非常突然;)

标签: c++ memory memory-leaks delete-operator


【解决方案1】:

当数组大小等于 2 时,我发现了一个问题 既然你打电话

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

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

array1 = array;
array2 = array+1;

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

【讨论】:

  • 太棒了!那解决了它!感谢您的帮助!
【解决方案2】:

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

if (size1 > 1)
   delete [] array1;
if (size2 > 1)
   delete [] array2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2012-07-31
    • 2017-04-19
    • 2015-09-22
    • 2020-03-09
    • 2017-07-06
    相关资源
    最近更新 更多