急问c++高手什么原因会造成stack overflow?如何解决?Visual Studio 如何调大堆栈大小?

lhslktg 2009-08-19 04:35:24
急问c++高手什么原因会造成stack overflow?如何解决?如何调大堆大小?

我用的是VS2008 +window

先回答一下这个紧急的问题吧:
听说堆栈大小默认1M, 应该是可以调大的。 不知道在Visual Studio 2008 里面如何调大呢? 有没有上限大小?


具体问题是:
程序是一大循环,套一些小循环。 debug的时候什么信息都没显示。就发现大循环做到一定次数程序就停了,也没有抱错。

后来我用debug进去调试,发现显示以下信息:
Unhandled exception at 0x0041d149 in a.exe: 0xC00000FD: Stack overflow.

请大家说下引起这个的可能原因有哪些?
是局部变量太多还是什么?

对应各种原因要如何解决呢?



谢谢
...全文
8297 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyj19871987 2010-11-10
  • 打赏
  • 举报
回复
我用了递归,结果当工作量一大的时候就会导致这个问题的发生,递归还是最好不要乱用。
wanghonglin1985 2010-05-04
  • 打赏
  • 举报
回复
malloc, new

[Quote=引用 9 楼 steedhorse 的回复:]
循环不会对栈造成额外的使用量,递归才会。还是仔细检查一下吧。
当然,你把前后那两次循环做成两个小函数,则栈的用量应该还能减少。
[/Quote]
mLee79 2009-08-27
  • 打赏
  • 举报
回复
一直习惯4K的的栈段的说,有16K的栈真幸福啊。。。
MichelleMSU 2009-08-27
  • 打赏
  • 举报
回复
受教,遇到了同样的问题。。。
lhslktg 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 gongxinheng 的回复:]
设置线程栈的大小可以再链接器命令行中设置
/stack:size
size即是设置的堆栈大小,单位(字节)
也可以在创建线程(通常是CreateThread)时传递堆栈大小参数
[/Quote]

请问如何 在创建线程(通常是CreateThread)时传递堆栈大小参数?

如何 在链接器命令行中设置
/stack:size ?
Y神圣 2009-08-20
  • 打赏
  • 举报
回复
可以调整栈大小?!从来没有用过,学习。
晨星 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 yaoqian156 的回复:]
另外再说一句,线程栈没有那么容易溢出的,我曾经往一个vector中push过十万多个大结构体,也没事.
[/Quote]
——往vector中push数据占用的是堆空间。
不过你说的对,栈不是那么容易溢出的。我都写了10几年程序了,还从来没有一次调过编译器的/stack参数。
zhongchengli 2009-08-20
  • 打赏
  • 举报
回复
递归最好别用!
24K純帥 2009-08-20
  • 打赏
  • 举报
回复
up
ljx87085210 2009-08-20
  • 打赏
  • 举报
回复
恩 我觉得24楼的说法有道理,楼主你好好检查一下代码,如果程序里面很多循环,如果你在某一个地方用i递加循环,但是可能别的地方又用到了,这时候i可能会因为值过大,在别的地方引用的时候出错了。建议楼主把代码好好检查一下,是不是循环变量重复使用的情况。一般我都不用同一个变量循环,比如叫i,iCont,iNum等待,如果循环动用i,尤其是循环里面套着循环,很容易出错
lhslktg 2009-08-20
  • 打赏
  • 举报
回复
我那些不断调用自身的 大函数,和其内部的一个调用自身的函数都是 无返回值,不传参数的void a();
函数内部对外部的许多公用数据进行计算,修改值。 内部会有一些局部变量
但应该并不是递归,当前循环的数据计算当前解决,不需要用到函数调用的结果来计算以前未完的成的函数计算。

不知道这个stack overflow 是如何出来的。
大概大函数调用自己很多次,怎么就stack overflow了?

程序应该没有变量命名的错误。
HengStar 2009-08-19
  • 打赏
  • 举报
回复
设置线程栈的大小可以再链接器命令行中设置
/stack:size
size即是设置的堆栈大小,单位(字节)
也可以在创建线程(通常是CreateThread)时传递堆栈大小参数
liberright 2009-08-19
  • 打赏
  • 举报
回复
看看汇编代码吧。一般如果是递归造成爆栈,一般都是回调条件出错了!呵呵
yaoqian156 2009-08-19
  • 打赏
  • 举报
回复
虽然大家提供的是标准解决栈溢出的方法,但是楼主出错的地方绝对不是栈溢出这么简单,stack overflow可能是楼主代码错误的一个表现,例如for循环中,可能因为粗心,把循环子写错,明明是i,在用到i的地方写成j了等等等等,仔细检查一下代码吧,我遇见过的几次栈溢出都是这种原因。
另外再说一句,线程栈没有那么容易溢出的,我曾经往一个vector中push过十万多个大结构体,也没事.
neverdoitagain 2009-08-19
  • 打赏
  • 举报
回复
1. 可能递归过深
2. local variable太多,把stack都耗光了
3. 函数入口参数类型字节太大,这个也是耗stack的,改成reference或者point
晨星 2009-08-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lhslktg 的回复:]
您说的 设置一下stack 是什么意思?
我已经把VS2008里面 Stack reserved size”选项 在前面几位朋友介绍的那样 调成 1024000000 可是还是像没调的时候调用一样的次数就停止了。
请问还有什么参数可以调大的呢?
[/Quote]
那要不你把Stack commit size也调调看吧。。。- -b
das_jack 2009-08-19
  • 打赏
  • 举报
回复
注意这些数据结构参数的类型,如果传值的话,每次调用都会复制这些数据结构,改为传引用
wish_cn 2009-08-19
  • 打赏
  • 举报
回复
The default size for the reserved and initially committed stack memory is specified in the executable file header. Thread or fiber creation fails if there is not enough memory to reserve or commit the number of bytes requested. To specify a different default stack size for all threads and fibers, use the STACKSIZE statement in the module definition (.def) file. For more information on these default sizes and how to change them, see the documentation included with your linker.

一般不开大的栈变量,不做太深的递归,1M完全是够用的。
lhslktg 2009-08-19
  • 打赏
  • 举报
回复
在大函数的外面有公用的几千大小的 vector,map 若干个, 这个每调用一次 大函数都会 是否都会把他们放入stack中呢?
共用的呀。在 大函数外面就定义了,大函数的运算会增大他们的大小。


您说的 设置一下stack 是什么意思?
我已经把VS2008里面 Stack reserved size”选项 在前面几位朋友介绍的那样 调成 1024000000 可是还是像没调的时候调用一样的次数就停止了。
请问还有什么参数可以调大的呢?
  • 打赏
  • 举报
回复
就是你变量占用内存过多咯,你肯定有申请较大的数组。
改善算法,或者设置一下stack。
加载更多回复(17)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧