我正在尝试实现合并排序算法,但我不知道为什么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)
指针right由线改变
right++;
Run Code Online (Sandbox Code Playgroud)
执行该行后,right不再是通过分配的指针new[],因此将其传递给delete[]是非法的。
该行应更改为
rightPointer++;
Run Code Online (Sandbox Code Playgroud)
就像你在增加leftPointer而不是left在前一行。
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |