最近总被这个错误困扰,查了一下msdn,他举了一个递归调用的例子,但是我的情况应该与此不同。
不知道各位能否指点一下这个stack overflow还会有什么原因。多多拜上。

解决方案 »

  1.   

    局部变量申请得太多,默认stack只有1M,声明的局部变量超过这个限制就会overflow
      

  2.   

    高手,不过也不太象,我把线程的stack开成了最大值问题依然。
    是这样的我的系统每隔50多个小时就会退出,从dr.华生里看到的是这个stack overflow.
    我尝试着跑debug版,但是出错时定位到的堆栈里都是mfc42d.dll中的,没有我们的代码,
    同时我也把各个动态库中的stack allocation变大,故障依然,妈的,这堆烂代码。不知道,
    您现在对我有没有什么建议,不胜感激。
      

  3.   

    接手一堆烂代码,确是十分痛苦,呵呵.
     
      我建议楼主装一个BoundsChecker,对代码重新编译,在Debug版中对程序的各个分支进行执行,BoundsChecker将对代码中有可能出问题的代码一一提示,当然不可能做到100%的准确,不过相信还是有一定的帮助.
      

  4.   

    是这样的,我同事原来也遇到过类似的问题,后来把project设置里的堆栈加大就可以了,默认是1M,你可以加大到10M试试.
    project->setting->link:
    在category里选择output,在stack的Reserve里输入0x10000000试试每当创建一个线程时,系统就会为线程的堆栈(每个线程有它自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交给这个已保留的区域。按照默认设置,系统保留1MB的地址空间并提交两个页面的内存。但是,这些默认值是可以修改的,方法是在你链接应用程序时设定Microsoft的链接程序的/STACK选项:/STACK:reserve[,commit]
    当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。
      

  5.   

    刚刚发现对pomelowu(羽战士)的回复有些需要解释的地方,我说不太象是指这个现象不太象。在此向他致歉。
      

  6.   

    除了 lzzqqq(Jonersen) 的方法,你也可以把一些大空间开辟在堆上,只在栈上定义小容量的变量
      

  7.   

    有些MFC或者ATL的宏会使用堆栈空间,比如OLE2T。
    如果在某个函数中大量调用OLE2T宏,就有可能导致堆栈溢出。这些宏在堆栈上分配空间(而不是在堆上),具体可以参看:TN059: Using MFC MBCS/Unicode Conversion Macros
    The implementation of each macro uses the _alloca() function to allocate memory from the stack instead of the heap. Allocating memory from the stack is much faster than allocating memory on the heap, and the memory is automatically freed when the function is exited.
    呵呵,希望对楼主有用。