gpt4 book ai didi

c++ - 在 C++ 中删除动态分配的数组时出现混淆错误

转载 作者:行者123 更新时间:2023-11-28 07:47:51 24 4
gpt4 key购买 nike

我正在尝试实现一个简单的归并排序算法。我很困惑的是删除“array2”后,我不断收到以下错误消息。

" free():下一个尺寸无效(快速)"

请指教。非常感谢!

#include <iostream>
#include <limits.h>

using namespace std;

void merge_sort(int*,int,int);

int main(){
//cout << "Max int: " << INT_MAX <<endl;
int n;
cin >> n;
int* array = new int(n+1);
for (int i=1; i<=n; i++)
cin >> array[i];
merge_sort(array,1,n);
cout << "--------------------------------------------" <<endl;
for (int i=1; i<=n; i++)
cout << array[i] <<endl;
}

void merge_sort(int* array,int p,int r){
cout << p << ' ' << r <<endl;
if (p == r)
return;
int q = int((p+r)/2);
merge_sort(array,p,q);
merge_sort(array,q+1,r);
//(p..q) and (q+1 .. r) sorted, then merge this two sorted array
int n1 = q-p+1;
int n2 = r-q;
cout << "Mark1 " <<n1<<' '<<n2<<endl;
int *array1;
array1 = new int(n1+1);
int *array2;
array2 = new int(n2+1);
for (int i=p; i<=q; i++)
array1[i-p] = array[i];
for (int i=q+1; i<=r; i++)
array2[i-q-1] = array[i];
array1[n1] = INT_MAX;
array2[n2] = INT_MAX; //CONSTANT, serve as sentinel

int p1 = 0;
int p2 = 0;
cout << "Mark2" << endl;
for (int i=p; i<=r; i++){
if (array1[p1]<array2[p2]){
array[i] = array1[p1];
p1++;
}else{
array[i] = array2[p2];
p2++;`enter code here`
}
}
cout << "Mark3" << endl;
delete [] array2;
cout << "Delete array2 " << endl;

delete [] array1;
cout << "Delete array1 " << endl;
}

最佳答案

语法

new int(n+1)

在自由存储上创建一个 int 并使用 n+1 对其进行初始化,然后立即使用 array[1 越界访问它]。你想要括号:

new int[n + 1]

这将创建一个数组。程序中的所有其他地方也是如此。

此外,由于您在 1 处开始循环,因此对象 array[0] 未初始化,如果您访问它,您会得到未定义的行为,而您确实这样做了。这是白白浪费一个数组元素,给自己设下陷阱,我建议你不要在数组大小上加 1,索引从 0 开始。

关于c++ - 在 C++ 中删除动态分配的数组时出现混淆错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14514840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com