首页 > 解决方案 > 为什么 delete[] 在这里抛出异常?

问题描述

我正在尝试实现合并排序算法,但我不知道为什么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;
}

标签: c++delete-operator

解决方案


指针right由行改变

right++;

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

该行应更改为

rightPointer++;

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


推荐阅读