Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 排序程序错误(检测到堆损坏)_C++_Sorting - Fatal编程技术网

C++ 排序程序错误(检测到堆损坏)

C++ 排序程序错误(检测到堆损坏),c++,sorting,C++,Sorting,这个程序是关于bubbleSort、insertionSort和qsort时间的 我运行我的程序并得到调试错误 HEAP CORRUPTION DETECTED:after Normal block(#152)at 0x006613C0 CRT Detected 应用程序在堆缓冲区结束后写入内存 然后,我删除了void part_1(int n)中的最后3行代码(delete[]a;delete[]b;delete[]c),以使其正常工作。我的教授告诉我“你的程序应该有其他错误,这些错误会导

这个程序是关于bubbleSort、insertionSort和qsort时间的

我运行我的程序并得到调试错误

HEAP CORRUPTION DETECTED:after Normal block(#152)at 0x006613C0 CRT Detected 
应用程序在堆缓冲区结束后写入内存

然后,我删除了
void part_1(int n)
中的最后3行代码(delete[]a;delete[]b;delete[]c),以使其正常工作。我的教授告诉我“你的程序应该有其他错误,这些错误会导致 delete语句中的失败。”并且我不应该删除最后3行代码。我找不到它。请帮忙

// Part-1 : --------------------------- sorting algorithms

void bubbleSort(double *x, int n)
{
// Implement the sorting function using the bubble sort algorithm.
double temp;
for (int j = 0;j < n;j++) {
    for (int i = 0;i < n;i++) {
        if (x[i] > x[i + 1]) {
            temp = x[i];
            x[i + 1] = x[i];
            x[i + 1] = temp;
        }
    }
  }
}


void insertionSort(double *x, int n)
   {
// Implement the sorting function using the insertion sort algorithm.

for (int i = 1;i < n;i++) {
    double temp = x[i];
    int j = 0;
    for (j = i - 1;j >= 0 && x[j]>temp;j--) {
        x[j + 1] = x[j];
    }
    x[j + 1] = temp;
  }

}


int compare_1(const void *a, const void *b) {
double *X = (double *)a;
double *Y = (double *)b;
if (*X > *Y) {
    return 1;
}
else if (*X < *Y)
    return -1;
return 0;

}

void part_1(int n)
{
srand((unsigned)time(NULL));  // set the seed of the random number generator

double *a = new double[n];  // create 3 arrays with identical contents
double *b = new double[n];
double *c = new double[n];

for (int i = 0; i < n; i++)
    a[i] = b[i] = c[i] = rand() / 10000.0;

clock_t begin, end;
double elapsedTime;

cout << "Bubble sort: sorting an array of size " << n << endl;
begin = clock();
bubbleSort(a, n);
end = clock();

elapsedTime = (double)(end - begin) / CLOCKS_PER_SEC;
cout << "Elapsed time = " << elapsedTime << " seconds" << endl << endl;

for (int i = 0; i < n - 1; i++)
    if (a[i] > a[i + 1])
    {
        cout << "Bubble sort : Incorrect results\n\n";
        break;
    }

cout << "Insertion sort: sorting an array of size " << n << endl;
begin = clock();
insertionSort(b, n);
end = clock();

elapsedTime = (double)(end - begin) / CLOCKS_PER_SEC;
cout << "Elapsed time = " << elapsedTime << " seconds" << endl << endl;

for (int i = 0; i < n - 1; i++)
    if (b[i] > b[i + 1])
    {
        cout << "Insertion sort : Incorrect results\n\n";
        break;
    }

cout << "Write your statements to sort array c[] using qsort()\n";
cout << "qsort: sorting an array of size " << n << endl;

begin = clock();

// #### write your statements to sort array c[] using qsort().
//      Define your own compare function.
qsort(c, n, sizeof(double), compare_1);

end = clock();

elapsedTime = (double)(end - begin) / CLOCKS_PER_SEC;
cout << "Elapsed time = " << elapsedTime << " seconds" << endl << endl;

for (int i = 0; i < n - 1; i++)
    if (c[i] > c[i + 1])
    {
        cout << "qsort : Incorrect results\n\n";
        break;
    }
delete[] a;
delete[] b;
delete[] c;
}
int main()
{
part_1(50000);

system("pause");
return 0;
}
//第1部分:------------------------------排序算法
void bubbleSort(双精度*x,整数n)
{
//使用气泡排序算法实现排序功能。
双温;
对于(int j=0;jx[i+1]){
温度=x[i];
x[i+1]=x[i];
x[i+1]=温度;
}
}
}
}
void insertionSort(双*x,整数n)
{
//使用插入排序算法实现排序功能。
对于(int i=1;i=0&&x[j]>temp;j--){
x[j+1]=x[j];
}
x[j+1]=温度;
}
}
整数比较_1(常数无效*a,常数无效*b){
双*X=(双*)a;
双*Y=(双*)b;
如果(*X>*Y){
返回1;
}
否则,如果(*X<*Y)
返回-1;
返回0;
}
无效部分_1(整数n)
{
srand((无符号)time(NULL));//设置随机数生成器的种子
double*a=new double[n];//创建3个具有相同内容的数组
双精度*b=新双精度[n];
双精度*c=新双精度[n];
对于(int i=0;icout在
bubbleSort
中,您的数组索引超出范围。请修改如下所示的函数,您将看到发生的情况:

void bubbleSort(double *x, int n)
{
  // Implement the sorting function using the bubble sort algorithm.
  double temp;
  for (int j = 0; j < n; j++) {
    for (int i = 0; i < n; i++) {
      if (i + 1 >= n)
      { // index is out of range
        cout << "Bummer\n";
        exit(1);
      }
      if (x[i] > x[i + 1]) {
        temp = x[i];
        x[i + 1] = x[i];
        x[i + 1] = temp;
      }
    }
  }
}
void bubbleSort(双*x,整数n)
{
//使用气泡排序算法实现排序功能。
双温;
对于(int j=0;j=n)
{//索引超出范围
cout x[i+1]){
温度=x[i];
x[i+1]=x[i];
x[i+1]=温度;
}
}
}
}

其他排序函数中很可能存在类似问题。

此错误是由于内存损坏而发生的。此处内存损坏是因为写入超过了数组限制。 如果有一个由5个整数组成的数组,比如

int array[5];
你不应该做这样的事情

int n=4;
array[n+1] = 10; //array out of bound memory write operation
C/C++不检查数组越界操作。它允许这样的操作而没有编译错误。结果是,当你运行程序时,任何事情都可能发生。所以检查这样的错误是程序员的责任

在您的代码中可以找到一个这样的实例

void bubbleSort(double *x, int n)
{
// Implement the sorting function using the bubble sort algorithm.
double temp;
for (int j = 0;j < n;j++) {
    for (int i = 0;i < n;i++) {
        if (x[i] > x[i + 1]) {
            temp = x[i];
            x[i + 1] = x[i]; // out of bound write when i=n-1.
            x[i + 1] = temp;
        }
    }
  }
}
void bubbleSort(双*x,整数n)
{
//使用气泡排序算法实现排序功能。
双温;
对于(int j=0;jx[i+1]){
温度=x[i];
x[i+1]=x[i];//当i=n-1时进行越界写入。
x[i+1]=温度;
}
}
}
}

提示:检查数组索引是否没有越界。在C中没有自动检查,使用越界索引访问数组是未定义的行为。有一个简单的技巧可以修复这些类型的错误:用
std::vector a;
替换
double*a
,后跟
a.resize(n)使用
.at(i)
而不是
[i]
。这样,您就不需要处理内存,而且每次访问数据时都会得到一个边界检查。一个问题是,格式设置使程序难以阅读和理解。不过,理解它是进一步分析所必需的,所以请先解决这个问题。如果您正在破坏堆栈,那么您可能正在编写超过结尾的代码你的数组。使用std::vector可以帮你解决这个问题。旁白:你没有向教授寻求帮助的原因是什么?支付学费然后不提问似乎很奇怪。@UKMonkey他不是在糟蹋堆栈而是在糟蹋堆。这并不能解释在
delete[]时崩溃的原因
语句,是吗?@奇怪的是,是的。访问带有越界索引的数组是未定义的行为。从那时起,任何事情都可能发生。UB是一个懒惰的解释,而(至少对我来说)根本不是一个解释。我想真正的原因可能是(取决于分配器和操作系统)因为他在一行中创建了3个数组。在这种情况下,运行时可能会将它们按顺序放入内存中,当他离开第一个数组时,他会有效地破坏第二个数组的元数据。这会在删除第二个数组时导致崩溃。内存损坏错误在发生时并不总是可检测的,但如果分配器添加sentinel每次分配前后的数据在释放内存时可以检测到,因为它会检查以确保这些字节不变。如果是,则会出现错误。答案是未定义的行为,但这些错误的检测时间和方式是由实现定义的。例如,在release中可能根本检测不到错误模式,因为只有调试分配器执行这些检查。@freakish Retired Ninja的评论适用于此处。这正是OP的特定平台(Microsoft Visual Studio)上发生的情况。