【问题标题】:Declaring a big global variable in c++ results in the error message 0xc0000018在 C++ 中声明一个大的全局变量会导致错误消息 0xc0000018
【发布时间】:2020-08-03 21:21:01
【问题描述】:

对于我的应用程序,我需要在全局内存中声明一个大的std::array。它的总大小约为 1GB。所以我像这样声明了一个全局变量:

#include<array>

std::array<char,1000000000> BigGlobal; 

int main()
{
    //Do stuff with BigGlobal
}

代码编译良好。当我运行应用程序时,我收到错误消息:

应用程序无法正确启动 (0xc0000018)。点击确定关闭应用程序

我正在使用 Visual Studio 2017。我知道堆栈保留大小有一个 MSVC 链接器选项。但它只与局部变量有关,与全局变量无关。你能帮我解决这个问题吗?

【问题讨论】:

  • 有什么原因不能在全局范围内使用std::vector,并在main 的第一条语句中调整它的大小?
  • 你是编译成 32 位还是 64 位的可执行文件?
  • @Botje 我正在以 64 位模式编译。
  • @Bathsheba 您提出的解决方法似乎有效。您想发布您的建议作为答案吗?
  • @BlueTune:我已经尝试过了。

标签: c++ visual-c++ global-variables


【解决方案1】:

根据Does std::array<> guarantee allocation on the stack only?

std::array 分配在堆栈上,而不是堆上,所以如果你需要大量内存,使用它是个坏主意

我会使用 std::vector 并进行动态分配。

这可以按如下方式完成:

#include<vector>

static std::vector<char> BigGlobal; 

int main()
{
   // one time init: can be done anywhere.
   if (BigGlobal.empty())
   {
       BigGlobal.resize(1000000000);
   }

    //Do stuff with BigGlobal
}

【讨论】:

  • 全局变量既不存储在堆栈中,也不存储在堆中。见SO
  • 请记住 main 不能从自身调用(直接或间接),所以我认为您的 if 声明是不必要的。除非您正在考虑防止分叉?
  • 我不同意这是一个“坏主意”。如果合适的话,如果可能的话,我更喜欢std::array 而不是std::vector
  • @Bathsheba 你是对的,对如何使用全局变量知之甚少,我展示了如何确保它只分配一次,但在示例的上下文中它是无用的。
  • @BlueTune 感谢您的澄清,我忘记了 BSS。我更正了我的答案。
【解决方案2】:

C++ 编译器充满了限制 - 有些成为标准,有些则没有。

常见的限制包括对变量名称长度的大小限制、函数可以(直接或间接)调用自身的次数、具有自动存储持续时间的变量占用的最大内存大小等等。

您在使用std::array 时遇到了另一个限制。

在您的情况下,一个明智的解决方法是使用std::vector 作为全局类型,然后在main 的第一条语句中调整该向量的大小。当然,这假设在程序控制到达 main 之前没有使用全局变量 - 如果有的话,则将其放在更明确的地方。

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多