为什么 delete[] 在这里抛出异常?

1 c++ delete-operator

我正在尝试实现合并排序算法,但我不知道为什么delete[] right会抛出异常:

Invalid address specified to RtlValidateHeap.

删除该行可以解决问题,但这会导致内存泄漏,对吗?delete[] left这里不会造成问题。

void Merge(int data[], int from, int middle, int to)
{
    int leftLength = middle - from + 1;
    int rightLength = to - middle;
    
    int* left = new int[leftLength + 1];
    int* right = new int[rightLength + 1];

    for (int i = 0; i < leftLength; i++)
    {
        left[i] = data[from + i];
    }

    for (int i = 0; i < rightLength; i++)
    {
        right[i] = data[middle + i + 1];
    }

    left[leftLength] = INT_MAX;
    right[rightLength] = INT_MAX;
    
    int leftPointer = 0;
    int rightPointer = 0;

    for (int i = from; i <= to; i++)
    {
        if (left[leftPointer] < right[rightPointer])
        {
            data[i] = left[leftPointer];
            leftPointer++;
        }
        else
        {
            data[i] = right[rightPointer];
            right++;
        }
    }

    delete[] left;
    delete[] right;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*CAT 6

指针right由线改变

right++;
Run Code Online (Sandbox Code Playgroud)

执行该行后,right不再是通过分配的指针new[],因此将其传递给delete[]是非法的。

该行应更改为

rightPointer++;
Run Code Online (Sandbox Code Playgroud)

就像你在增加leftPointer而不是left在前一行。