今天,用vs2008调试一个C++程序时,出现下列提示:stack overflow。于是,逐步调试,发现错误出在,char str[100000]。仔细想想,原因应该是字符串长度太大,分配内存时,超过了栈的默认大小,一般栈的默认大小为1M。于是按下面步骤修改站和堆的默认大小。“项目”——“属性”——“连接器”——“系统”——将“堆保留大小”、“堆提交大小”、“堆栈保留大小”、“堆栈提交大小”全部改为102400000(单位应该是字节)。再运行,确实没有刚才的错误了,不过这时,又冒出来以下的错误提示:无效的系统DLL重定位 (具体错误提示:系统DLL user32.dll在内存中重定位,应用程序将不能正常运行.由于DLL C:/WINDOWS/system32/SHELL32.dll占用了为Windows系统DLL保存的地址空间而产生了错误。)他奶奶的,真是一波刚平,一波又起啊。立马百度,搜到以下解决方案:
(1)当出现“无效的系统dll重定位“,你可以试下windows自带的计算器 calc.exe。如果 计算器没问题,估计是你手动删哪个程序时没删好,检查一下就ok了。
(2)不过因为shell32.dll 或 user32.dll 都是系统保护的文件,基本不会出现1.的情况。大多数都是因为,安装了xp美化程序,导致shell32.dll和其他dll文件重写了。
解决方案:
(1)如果你有xp安装盘(最好是原版)win+R 运行中,输入:sfc /scannow,系统会启动文件保护程序,不出意外,系统恢复。
(2)系统还原,如果你有还原点,找到装美化程序以前的一个还原点,还原即可。
(3)如果没有系统盘,下载个shell32.dll 在安全模式,或dos覆盖即可。
(4)重装系统(网上谁的机器一出问题,楼下跟帖的最多的回答,傻X)
仔细审查和尝试,发现没一个解决方案有鸟用。奶奶的,还是自己动手,丰衣足食吧。冷静下来一想,感觉问题应该还是出在堆栈默认大小的设置上,是不是刚才设置的堆栈默认大小太大了呢?于是,将默认堆栈大小改为10240000(去掉一个0),重新生成解决方案,在运行,一切OK看了。至于什么原因,还得好好想一下。