我正在使用 Microsoft Visual C++ 2008 Express,但遇到了一个非常烦人的问题。这在 XP 中似乎不会发生,但在 Vista 中我找不到解决方法。每当我非动态声明变量时,如果它们的总大小超过大约 30mb,程序将在启动时立即崩溃。我知道 Vista 将非 Win32 应用程序限制为 32mb 内存,但我不认为这是我的问题。我正在使用 Microsoft 编译器,无论它是 win32 控制台应用程序还是 win32 窗口应用程序,都会发生这种情况。我只是声明...
int foo[1000][1000]
...或者任何变量的组合都会在任何地方产生相似的大小,那就是再见应用程序了。有趣的是,即使存在此错误,它仍有大约 25% 的时间运行。我在这里错过了一些基本的编程知识吗?静态分配已经过时了吗?我是否必须重做整个应用程序才能使用动态分配?
最佳答案
Is static allocation obsolete?
您没有进行静态分配 - 您正在进行自动分配,正如其他人所说,您的堆栈即将耗尽。
在 C++ 中为数据保留空间基本上有三种常见方法:
在堆栈上 - 这些被称为“自动变量”,它们就是普通的函数局部变量。假设你的“int foo[][]”是 main() 本地的,那么这就是这个。自动数据受到可用堆栈大小的限制,但分配非常快(基本上为零时间)。
静态 - 这些是函数局部变量或类变量,以“静态”一词开头,或者它们是在函数或类范围之外定义的变量。静态数据由编译器保留。没有分配时间开销,但内存是为应用程序的整个运行时保留的。
在堆上 - 这些是通过“new”或“malloc”或某种在内部进行这些调用的机制进行分配的。分配和释放比前两者慢,但是系统给你多少内存你就可以拥有多少,用完后还可以归还。
这三个有细微的变化 - 例如 alloca 是 1 和 3 的混合体,但这些是基础知识。
关于memory - Vista中的静态内存分配会导致崩溃吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/341782/