2

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 によって直接割り当てられたポインターしか解放できないというエラーが表示されました。

助けてください!よろしくお願いします。

4

1 に答える 1

3

追加する必要があります

free(arrayLeft);
free(arrayRight);

また、その長さがmergeSortで1の場合でも、配列をmallocしてコピーします。

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 の呼び出し元は、取得した配列を常に所有することが保証されるため、すべての場合にそれを解放する必要があります。

試してみたときにうまくいかなかった理由は、単純な配列のコピーを作成しなかったためであり、その結果、それらの一部が二重に解放されました。

于 2013-09-07T02:40:09.610 に答える