【问题标题】:Dynamic memory allocation in merge sort合并排序中的动态内存分配
【发布时间】:2012-09-22 10:08:35
【问题描述】:

我编写了一个合并排序程序(我编写了基本算法)——它运行良好。但是,由于我必须从一个非常大的文件中读取整数,所以我想在递归调用中动态声明数组。因此我编写了以下代码,但是它给了我一些错误,请您帮我确定我在哪里犯了错误?

该程序实际上是计算一个数组中的反转次数(如果 i arr[j] ,那么这是一个反转)。我写的程序如下: 每次我进行递归调用时,我都不想在堆栈上声明一个包含 10000 个整数的数组

我得到的错误是:std::bad_alloc at memory location 0x004dd940.. 我已经编辑了问题,因此它包含错误消息。执行中断,Visual Studio 进入调试模式并打开文件 osfinfo.c

    #include<stdio.h>
    #include <iostream>
    using namespace std;
    unsigned int mixAndCount(int * arr,int low, int mid,int high) {
        int *num = new int[high-low+1];// THIS IS WHERE THE ERROR OCCURS
        int l = low ;
        int r = mid+1;
        unsigned int count=0;
        int i =low;

        while((l<=mid)&&(r<=high))
     {
      if(arr[l]<=arr[r])
      {
       num[i]=arr[l];
       l++;

      }
      else
      {
      num[i]=arr[r];
       r++;
       count=count + (mid-l+1);

      }
      i++;
         }
     if(l>mid)
     {
      for(int k=r;k<=high;k++)
      {
       num[i]=arr[k];
       i++;
        }
     }
     else
     {
      for(int k=l;k<=mid;k++)
      {
       num[i]=arr[k];
       i++;
        }
     }
     for(int k=low;k<=high;k++) arr[k]=num[k];
delete[] num;    
return count;
    }

    unsigned int mergeAndCount(int * arr, int low , int high ) {
        if(low>=high) {
        return 0;
        }
        else {
            int mid = (low+high)/2;

            unsigned int left = mergeAndCount(arr, low , mid);
            unsigned right = mergeAndCount(arr, mid+1, high);
            unsigned int split = mixAndCount(arr, low , mid , high);
            return left+right+split;

        }

    }
    int main ()
    {
        int  numArr[100000];
        FILE * input = fopen("IntegerArray.txt", "r");
        int i =0;
        while(!feof(input)) {
            int num;
        fscanf(input, "%d", &num);
        numArr[i] = num;
        i++;
        }
        fclose(input);
        unsigned int count = mergeAndCount(numArr,0, i-1  );
        cout<<count<<endl;
        return 0;
    }

【问题讨论】:

  • 如何在不实际发布您遇到的错误的情况下要求解决编译错误?这不是霍格沃茨,这里也没有魔杖巫师。
  • 它给出了哪些错误?请简单地复制粘贴错误消息。
  • @gexicide :我已经编辑了问题,因此它包含错误消息。执行中断,Visual Studio 进入调试模式并打开文件 osfinfo.c
  • 你确定是这条线吗? main 的第一行已经将一个巨大的数组拖到堆栈上,这可能会立即溢出。
  • @gexicide 是的,我敢肯定,当我在堆栈上而不是动态地声明堆栈时,我的程序运行顺利

标签: c++ sorting pointers dynamic merge


【解决方案1】:
 std::bad_alloc at memory location 0x004dd940..

new无法成功分配请求的内存时抛出的异常。

int *num = new int[high-low+1];  

请求的内存似乎太大了,这意味着您需要跟踪highlow的值。

【讨论】:

  • 是的,但为什么会发生这种情况呢?我的意思是我要求的最大内存是 100000 个整数,这对于堆来说并不算大...
  • @RohitAgrawal:你是如何决定它对于堆来说不是太大的?您的程序是否通过减少请求的内存来工作?
  • high 和 low 最大为 0 和 99999,在一种情况下也是如此。我在退出函数之前删除了请求的内存
【解决方案2】:

注意动态内存分配。它真的很慢。在您将代码保留在此表单中之前,请考虑两次。你可以用std::chrono做一个简单的测试用例

http://en.cppreference.com/w/cpp/chrono/duration

您不需要动态分配,一切都在一个本地命名空间中完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2013-10-17
    相关资源
    最近更新 更多