memory - Vista中的静态内存分配会导致崩溃吗?

标签 memory dynamic windows-vista static crash

我正在使用 Microsoft Visual C++ 2008 Express,但遇到了一个非常烦人的问题。这在 XP 中似乎不会发生,但在 Vista 中我找不到解决方法。每当我非动态声明变量时,如果它们的总大小超过大约 30mb,程序将在启动时立即崩溃。我知道 Vista 将非 Win32 应用程序限制为 32mb 内存,但我不认为这是我的问题。我正在使用 Microsoft 编译器,无论它是 win32 控制台应用程序还是 win32 窗口应用程序,都会发生这种情况。我只是声明...

int foo[1000][1000]

...或者任何变量的组合都会在任何地方产生相似的大小,那就是再见应用程序了。有趣的是,即使存在此错误,它仍有大约 25% 的时间运行。我在这里错过了一些基本的编程知识吗?静态分配已经过时了吗?我是否必须重做整个应用程序才能使用动态分配?

最佳答案

Is static allocation obsolete?

您没有进行静态分配 - 您正在进行自动分配,正如其他人所说,您的堆栈即将耗尽。

在 C++ 中为数据保留空间基本上有三种常见方法:

  1. 在堆栈上 - 这些被称为“自动变量”,它们就是普通的函数局部变量。假设你的“int foo[][]”是 main() 本地的,那么这就是这个。自动数据受到可用堆栈大小的限制,但分配非常快(基本上为零时间)。

  2. 静态 - 这些是函数局部变量或类变量,以“静态”一词开头,或者它们是在函数或类范围之外定义的变量。静态数据由编译器保留。没有分配时间开销,但内存是为应用程序的整个运行时保留的。

  3. 在堆上 - 这些是通过“new”或“malloc”或某种在内部进行这些调用的机制进行分配的。分配和释放比前两者慢,但是系统给你多少内存你就可以拥有多少,用完后还可以归还。

这三个有细微的变化 - 例如 alloca 是 1 和 3 的混合体,但这些是基础知识。

关于memory - Vista中的静态内存分配会导致崩溃吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/341782/

相关文章:

c - 从数组读取段错误(可能与 malloc/realloc 相关)

multithreading - Delphi指针内存和释放

php - 我需要帮助完成这个 3 级动态下拉列表

当消费者尝试调用托管在虚拟机上的 WCF 服务调用时,WCF 被拒绝访问

c - VC++ 内存分析器

c++ - 当您从 C++ 函数返回引用时会发生什么?

java - 用户如何(安全地)用 Java 编写自己的过滤器

c# - 为什么不能在 C# 中动态调度基本访问表达式?

.net - 从开发角度 : How do I convice the bosses to upgrade to Vista/Windows 7?

c - C中的内存分配