c - C 递归子程序中释放内存

标签 c malloc free mergesort

我想问一个关于在 C 中释放内存的问题。我正在实现 mergeSort 函数,如下所示:

合并子例程:

int* merge (int* array_left, unsigned int left_length, int* array_right, unsigned int right_length) {

    unsigned int result_size = right_length + left_length;
    int* result = malloc(result_size*sizeof(int));
    int r = 0; // result index 

    // Iterate through all left and right array elements
    int i = 0;  // left index
    int j = 0;  // right index
    while ( (i < left_length) && (j < right_length) ) {
        if ( *(array_left+i) < *(array_right+j) ) {
            *(result+r) = *(array_left+i);
            i++;
        } else {
            *(result+r) = *(array_right+j);
            j++;
        }
        r++;
    }

    // Fill the remaining elements to the result
    if (i < left_length)
        while (i < left_length) {
            *(result+r) = *(array_left+i);
            r++;
            i++;
        }

    if (j < right_length)
        while (j < right_length) {
            *(result+r) = *(array_right+j);
            r++;
            j++;
        }

    return result;
}

合并排序:

   int* mergeSort(int* array, unsigned int length) {
      // Base case
    if (length <= 1)
        return array;

    // Middle element
    unsigned int middle = length / 2;

    int* array_right =  mergeSort(array, middle);
    int* array_left = mergeSort(&array[middle], length-middle);

    // Result is merge from two shorted right and left array
    int* result = merge(array_left, length-middle, array_right, middle);

    return result;
}

程序运行正确,但我没有从 malloc 调用中释放内存,事实上我不知道如何放置 free()。我尝试释放 array_right 和 array_left 但收到错误消息,告诉我只能释放由 malloc 直接分配的指针。

请帮忙!先谢谢你们了。

最佳答案

您需要添加

free(arrayLeft);
free(arrayRight);

并且还 malloc 并复制数组,即使它的长度在 mergeSort 中为 1:

int* mergeSort(int* array, unsigned int length) {
    // Base case
    if (!length) return NULL;
    if (length == 1) {
        // Make a copy of a single-element array
        int *tmp = malloc(sizeof(int));
        *tmp = *array;
        return tmp;
    }
    ... // The rest of your code
}

这将确保 mergeSort 的调用者始终拥有它返回的数组,因此他在所有情况下都必须释放它。

当您尝试时它不起作用的原因是您没有复制普通数组,这导致其中一些数组被双重释放。

关于c - C 递归子程序中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18669099/

相关文章:

c - 用C在屏幕上绘制字体

c - 在具有两个以太网端口的机器上接收 UDP 广播

c - C 中的重新分配错误

c - 简单测试程序中无法解释的 malloc 调用 : malloc project

c - malloc 和 realloc 的问题

c - 结构问题: initialization makes integer from pointer without a cast

c - scanf:浮点格式未链接

c - 填充 malloc() 分配的内存的效果

C/Glib,我是否正确截断了这个 gchar 数组?

C malloc 和自由函数的奇怪行为