C++ 在c++;结果显示错误消息0xc0000018

C++ 在c++;结果显示错误消息0xc0000018,c++,visual-c++,global-variables,C++,Visual C++,Global Variables,对于我的应用程序,我需要在全局内存中声明一个大的std::array。它的总大小约为1GB。我声明了一个全局变量,如下所示: #include<array> std::array<char,1000000000> BigGlobal; int main() { //Do stuff with BigGlobal } #包括 std::数组BigGlobal; int main() { //与BigGlobal合作 } 代码编译得很好。运行应用程序时,我

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

#include<array>

std::array<char,1000000000> BigGlobal; 

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

#包括
std::数组BigGlobal;
int main()
{
//与BigGlobal合作
}
代码编译得很好。运行应用程序时,我收到错误消息:

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

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

根据

数组是在堆栈上分配的,而不是在堆上分配的,所以如果您需要一大块内存,那么使用它是个坏主意

我将使用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
}
#包括
静态std::向量BigGlobal;
int main()
{
//一次性初始化:可以在任何地方进行。
if(BigGlobal.empty())
{
BigGlobal.resize(100000000);
}
//与BigGlobal合作
}

C++编译器有很多限制——有些已经成为标准,有些则没有

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

使用
std::array
,您遇到了另一个限制


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

是否有理由不能在全局范围内使用
std::vector
,并在
main
的第一条语句中调整其大小?您是将其编译为32位还是64位可执行文件?@Botje我是在64位模式下编译的。@Bathsheba您建议的解决方法似乎有效。你想把你的提议作为答案发布吗?@BlueTune:我已经试过了。全局变量既不存储在堆栈中,也不存储在堆中。请务必记住,
main
不能从自身(直接或间接)调用,因此我认为您的
if
语句是不必要的。除非你是从防范叉子的角度考虑,否则我不认为这是一个“坏主意”。如果合适的话,我更喜欢
std::array
而不是
std::vector
possible@Bathsheba您是对的,由于对如何使用全局变量知之甚少,我演示了如何确保它只分配一次,但在示例的上下文中它是无用的。@BlueTune感谢您的澄清,我忘记了BSS。我更正了我的答案。