使用Visual Studio在C++中建议chkstk.asm stackoverflow异常

Gul*_*han 11 c++ stack-overflow recursion visual-studio visual-c++

我正在使用合并排序的实现.我正在尝试使用C++ Visual Studio 2010(msvc).但是当我使用300000个整数数组进行计时时,它显示了一个未处理的stackoverflow异常并将我带到一个名为"chkstk.asm"的只读文件.我将尺寸缩小到200000并且有效.同样的代码使用C-free 4编辑器(mingw 2.95)而没有任何问题,而大小是400000.你有任何建议让代码在Visual Studio中工作吗?

可能是mergesort中的递归导致了问题.

Gul*_*han 13

问题解决了.感谢Kotti提供的代码.我在与该代码比较时遇到了问题.问题不在于过多的递归.实际上我正在处理一个存储在堆栈上的普通C++数组.因此,问题耗尽了堆栈空间.我刚刚将它改为带有new/delete语句的动态分配数组,并且它工作正常.


Joe*_*Joe 6

我的猜测是你有这么多的递归,你刚刚耗尽了堆栈空间.您可以使用链接器的/ F命令行选项增加堆栈大小.但是,如果你继续达到堆栈大小限制,你可能想要重构算法的递归.


Cos*_*ert 6

我不完全确定,但这可能是你的yor merge sort实现的一个特殊问题(导致堆栈溢出).有很多很好的实现(使用谷歌),以下适用于数组大小= 2000000的VS2008.

(你可以在VS2010中试试)

#include <cstdlib>
#include <memory.h>

// Mix two sorted tables in one and split the result into these two tables.
void Mix(int* tab1, int *tab2, int count1, int count2)
{
   int i,i1,i2;
   i = i1 = i2 = 0;
   int * temp = (int *)malloc(sizeof(int)*(count1+count2));

   while((i1<count1) && (i2<count2))
   {
      while((i1<count1) && (*(tab1+i1)<=*(tab2+i2)))
      {
         *(temp+i++) = *(tab1+i1);
         i1++;
      }
      if (i1<count1)
      {
         while((i2<count2) && (*(tab2+i2)<=*(tab1+i1)))
         {
            *(temp+i++) = *(tab2+i2);
            i2++;
         }
      }
   }

   memcpy(temp+i,tab1+i1,(count1-i1)*sizeof(int));
   memcpy(tab1,temp,count1*sizeof(int));

   memcpy(temp+i,tab2+i2,(count2-i2)*sizeof(int));
   memcpy(tab2,temp+count1,count2*sizeof(int));
   free(temp);
}

void MergeSort(int *tab,int count) {
   if (count == 1) return;

   MergeSort(tab, count/2);
   MergeSort(tab + count/2, (count + 1) /2);
   Mix(tab, tab + count / 2, count / 2, (count + 1) / 2);
}

void main() {
   const size_t size = 2000000;
   int* array = (int*)malloc(sizeof(int) * size);
   for (int i = 0; i < size; ++i) {
      array[i] = rand() % 5000;
   }

   MergeSort(array, size);
}
Run Code Online (Sandbox Code Playgroud)