C++ 大输入上释放对象的校验和不正确
我已经编写了一个程序,它计算.txt文件中的反转数(第一个数字-数字的数量,而不是go数字本身)。对于较小的输入(5或10个数字),它可以正常工作,但当输入为100000个数字(每个数字小于100000个)时,我会得到以下错误:C++ 大输入上释放对象的校验和不正确,c++,c,algorithm,malloc,C++,C,Algorithm,Malloc,我已经编写了一个程序,它计算.txt文件中的反转数(第一个数字-数字的数量,而不是go数字本身)。对于较小的输入(5或10个数字),它可以正常工作,但当输入为100000个数字(每个数字小于100000个)时,我会得到以下错误: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to deb
incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug***
代码如下:
#include <stdio.h>
long int merge(int *arr, const int start, const int half, const int end)
{
int s=start;
int i=0;
int cinv=0;
int j=half+1;
int* barr = new int[end+start-1];
while((s<=half)&&(j<=end)){
if(arr[s]<=arr[j]){
barr[i]=arr[s];
s++;
}
else{
barr[i]=arr[j];
j++;
cinv++;
}
i++;
}
if(s>half){
for(int k = j;k<=end;k++){
barr[i]=arr[k];
i++;
}
}
else{
for(int k=s;k<=half;k++){
barr[i]=arr[k];
i++;
}
}
for(int k=0;k<=end-start;k++) {
arr[k+start]=barr[k];
}
delete[] barr;
return cinv;
}
long int mergesort(int* arr, int start, int end){
int half=(start+end)/2;
long int cinv=0;
if (start<end){
cinv+=mergesort(arr, start, half);
cinv+=mergesort(arr, half+1, end);
cinv+=merge(arr, start, half, end);
return cinv;
}
return cinv;
}
int main(){
int len;
freopen("input.txt", "rt", stdin);
freopen("output.txt", "wt", stdout);
scanf("%d", &len);
int *arr= new int[len];
for (int i=0; i<len; i++){
scanf("%d", &arr[i]);
}
long int cinv=mergesort(arr, 0, len-1);
printf("\nInversions with merge=%ld", cinv);
delete [] arr;
return 0;
}
#包括
长整数合并(整数*arr,常数整数开始,常数整数一半,常数整数结束)
{
int s=开始;
int i=0;
int-cinv=0;
int j=一半+1;
int*barr=newint[end+start-1];
而((s在merge
中临时数组的维度
int* barr = new int[end+start-1];
不正确。当使用start==0
和end==1
调用merge
时,这将产生0的数组维度。在数组的另一端,它将根据需要分配两倍的内存。将此更改为:
int* barr = new int[end - start + 1];
分配零字节是实现的。即使在输入小数组的情况下,程序也会在Linux平台上崩溃。
也许也可以适当添加“C”标记,因为这个代码绝对不是C++,而是C。
?您初始化它,给它分配int,然后再也不要对它做任何事情。merge
中的辅助数组barr
中的维度应该是end-start+1
@Arcothint*arr=new int[len];
不是C。内存损坏,应用。