我正在使用Microsoft Visual C ++ 2008 Express,并且有一个非常烦人的问题。它似乎不会发生在XP中,但在Vista中我无法找到解决方法。每当我非动态地声明变量时,如果它们的组合大小超过大约30mb,程序将在启动时立即崩溃。我知道Vista将非Win32应用程序限制为32mb内存,但我不认为这是我的问题。我正在使用Microsoft编译器,无论它是win32控制台应用程序还是win32窗口应用程序,它都会发生。我只是声明......
int foo[1000][1000]
...或任何变量的组合,导致任何地方都有相似的大小,那就是再见 - 应用程序。有趣的是,即使存在此错误,它仍会运行约25%。我在这里错过了一些基本的编程吗?静态分配是否已过时?我是否必须重做整个应用程序才能使用动态分配?
答案 0 :(得分:3)
静态分配是否已过时?
您没有进行静态分配 - 您正在进行自动分配,正如其他人所说的那样,您正在耗尽堆栈。
在C ++中基本上有三种为数据保留空间的常用方法:
在堆栈上 - 这些被称为“自动变量”,它们是普通的函数局部变量。假设你的“int foo [] []”是main()的本地,那么这就是这个。自动数据受可用堆栈大小的限制,但非常快速分配(基本上为零时间)。
静态 - 这些是函数本地或类变量,由“静态”一词继续,或者它们是在函数或类范围之外定义的变量。静态数据由编译器保留。没有分配时间开销,但内存是为应用程序的整个运行时保留的。
在堆上 - 这些分配了'new'或'malloc'或一些在内部进行调用的机制。与前两个相比,分配和释放速度很慢,但是你可以拥有系统给你的那么多内存,你可以在完成后返回它。
这三者有微妙的变化 - 例如,alloca是1&的混合体。 3,但这些都是基础。
答案 1 :(得分:1)
可能需要设置堆栈大小设置,默认为小的。我需要玩这些设置已经很长时间了。
最有可能的链接选项
我只有MSDEV 2005正在运行,但这里有关于堆栈链接器选项的说法:
/ STACK选项设置堆栈的大小(以字节为单位)。此选项仅在构建.exe文件时使用。
此选项指定虚拟内存中的总堆栈分配。默认堆栈大小为1 MB。链接器将指定值向上舍入为最接近的4个字节。
修改
除非您正在进行自己的内存管理,否则我无法理解为什么要静态分配它。但即使在这种情况下,我也会动态分配内存......
答案 2 :(得分:0)
问题是方法中的非动态分配变量是在堆栈上分配的,并且最大堆栈大小比总可用内存小很多。我认为它在Windows中约为30MB,是的。具有讽刺意味的是,你在这里所做的就是这个网站的名字。堆栈溢出。
编辑:根据http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt,Window的最大堆栈大小为32MB。