我目前使用的Visual Studio版本是2008。在这个版本下,正常编译无论如何是不会出C6262的,前几天做了一次"Code Analyzer"。检查出许多的警告,其中就有这个。
先贴上MSDN的解释吧——
http://msdn.microsoft.com/zh-cn/library/7yhee2f0(v=vs.90).aspx
警告 C6262:函数使用了堆栈中的 <constant> 个字节: 超过了 /analyze:stacksize<constant>。请考虑将某些数据移到堆中
此警告指出在函数内检测到了超出预设阈值的堆栈使用率。默认情况下,当堆栈大小超过 16K 字节时会生成此警告。堆栈是有限的,甚至在用户模式下也是如此,如果无法提交堆栈页,会导致堆栈溢出异常。_resetstkoflw 函数可以将系统从堆栈溢出的情况恢复为正常,从而使程序得以继续运行,而不会由于出现异常错误而失败。如果未调用 _resetstkoflw函数,则在上一个异常后不会显示保护页。当下次发生堆栈溢出时,根本不会显示异常,进程将在没有任何警告的情况下终止。
若要更正此警告,1。既可以将一些数据移至堆,2。也可以增加堆栈大小。无论采取哪一种更正措施,在对代码进行更改前均应考虑到所用方法的利弊。
简单说明一下,上面说的“将一些数据移至堆”,其实就是使用malloc或是new在堆里开辟动态内存来代替堆栈内使用静态内存的目的。这似乎可以从根本上解决这个问题,可是动态内存使用不当可能会产生内存泄漏;即便你是C/C++高手,所写代码也一定不会出问题,可有的公司就是内部规定一律不允许使用动态。。。至于说上面的方法2,修改编译选项增大堆栈大小的方法,只治标不治本的方法不可取。
回到我最关心的问题,到底这个警告需不需要对策呢?网上讨论相当少,只在下面找到一个相关链接。可还是没有完全回答这个问题。
http://forums.codeguru.com/archive/index.php/t-498135.html
最后,回到MSDN的英文版本,下面几句话是摘要。
1。 This warning indicates that stack usage that exceeds a preset threshold (constant 2) has been detected in a function.
这个常数(默认是16K)是单个函数使用堆栈的阈值;用户可使用默认堆栈总大小为1M。
2。In user mode, one large stack frame may not be a problem—and this warning may be suppressed—but a large stack frame increases the risk of a stack overflow.
用户态下,单个较大(指超过默认指定的16K)的堆栈片断可能并不会引起问题(实际上这个警告本身就可能因为用户设定而不会显示出来),但是它会增大堆栈举出的可能性。
3。 You can use the/analyze command-line option to change the value for <constant 2>, but increasing it introduces a risk that an error will not be reported.
你可能通过增大默认函数堆栈阈值来修正这个警告,而这样做会引入一个风险,致使(真的发生堆栈举出错误)时错误也不会被报上来。
说了这么多,我的结论——
1。 对于报这个警告的函数,当作对自己的一个提醒(Reminder),让我们再评估一下,有无必要使用这么大的堆栈;可否使用动态内存(堆)再或者使用全局变量代替?
2。如果评估的结果仍然大于16K,但是没有超过太多的话请忽视这个警告而不要修改编译参数让它不出现。