【问题标题】:Static memory allocation in Vista results in crash?Vista中的静态内存分配导致崩溃?
【发布时间】:2010-09-25 09:38:16
【问题描述】:

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

int foo[1000][1000]

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

【问题讨论】:

    标签: memory dynamic windows-vista static crash


    【解决方案1】:

    静态分配过时了吗?

    您没有进行 静态 分配 - 您正在进行 自动 分配,正如其他人所说,您的堆栈已用完。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可能需要设置一个默认为较小的堆栈大小设置。我已经很久没有使用这些设置了。

      在链接选项中最有可能

      我只有 MSDEV 2005 在工作,但这里是关于堆栈链接器选项的说明:

      /STACK 选项以字节为单位设置堆栈的大小。此选项仅在构建 .exe 文件时使用。

      此选项指定虚拟内存中的总堆栈分配。默认堆栈大小为 1 MB。链接器将指定的值四舍五入到最接近的 4 个字节。

      编辑

      除非您自己进行内存管理,否则我看不出您为什么要静态分配它。但即使在那种情况下,我也会预先动态分配内存......

      【讨论】:

        【解决方案3】:

        问题是方法中的非动态分配变量是在堆栈上分配的,并且最大堆栈大小远小于总可用内存。我认为它在 Windows 中约为 30MB,是的。具有讽刺意味的是,您在这里所做的是与该站点同名的。堆栈溢出。

        编辑:根据http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt,Window 的最大堆栈大小为 32MB。

        【讨论】:

        • Static 变量不在堆栈上分配,无论它们是否是函数/方法的本地变量。
        • 我不认为他的意思是关键字中的静态 - 而不是动态分配...我会 +1 因为我认为这不值得减去...
        • Joshua - 可能会编辑您的帖子以反映这一点。 - 或者我会
        • 谢谢蒂姆。你是对的,我用错了术语。实际的静态变量完全是另外一回事。
        猜你喜欢
        • 2022-01-12
        • 2014-11-22
        • 2016-02-21
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        • 2016-10-09
        相关资源
        最近更新 更多