在大输入时释放对象的校验和错误
incorrect checksum for freed object on large input
我写了一个程序,计算。txt文件中的反转数(第一个数字-数字的数量,而不是数字本身)。对于小输入(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 == 0
和end == 1
调用merge
时,这将产生一个数组维度为0。在数组的另一端,它将分配两倍于所需的内存。将其更改为:
int* barr = new int[end - start + 1];
分配零字节所做的是由实现定义的。您的程序在我的Linux平台上可靠地崩溃,即使输入数组很小。
相关文章:
- 如何用尽可能少的数据将数据缓冲区计算为零校验和值
- 计算校验和的逐位运算符
- 如何从存储在 QByteArray 中的十六进制值计算校验和
- 如何在 c++ 中计算对象的哈希/校验和/指纹?
- C++文件传输的校验和算法
- 如何从 IP 校验和字段中计算十六进制值
- 计算句子的校验和(XOR)(由不同变量/类型的组合形成)
- 目录校验和
- 编译后如何计算某些二进制功能(或基本块)的校验和
- PMS5003带有ESP8266-许多校验和错误
- 未正确的校验和释放对象 - 打印时错误
- 将C++校验和函数转换为 Java
- 确定是否使用boost.asio计算UDP校验和
- 校验和CRC 16从C 到Java
- 不同的CRC32校验和同一文件
- Qt,tcp/ip通信校验和
- 错误的校验和错误遍布程序
- XBee DigiMesh帧中的奇怪位和错误的校验和
- 释放对象的错误校验和与将多维向量传递给c++中的静态函数有关
- 在大输入时释放对象的校验和错误