gpt4 book ai didi

c++ - 大输入上释放对象的校验和不正确

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:00:10 24 4
gpt4 key购买 nike

我编写了一个程序来计算 .txt 文件中的反转次数(第一个数字 - 数字的数量,而不是 go 数字本身)。在小输入(5 或 10 个数字)上它工作正常,但当输入为 100,000 个数字(并且每个数字小于 100,000)时,我收到以下错误:

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;
}

预先感谢您的帮助。

最佳答案

merge 中临时数组的维度,

int* barr = new int[end+start-1];

不正确。当您使用 start == 0end == 1 调用 merge 时,这将产生一个维度为 0 的数组。在另一端数组,它将根据需要分配两倍的内存。将其更改为:

int* barr = new int[end - start + 1];

分配零字节的作用是实现定义的。即使输入数组很小,您的程序也能在我的 Linux 平台上可靠地崩溃。

关于c++ - 大输入上释放对象的校验和不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725845/

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