我尝试在堆栈上创建一个~975KB的数组,然后崩溃了。
const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash
这似乎是一个非常小的空间。在初始化变量之前,有没有办法知道有多少空间可用(总数和当前空间)?
答案 0 :(得分:6)
几乎所有系统都限制堆栈。允许的大小取决于OS /编译器组合。将大量数据放在堆栈上是一个糟糕的主意。使用C ++标准类型(例如vector
)或使用您自己的动态内存分配。你永远不知道什么时候其他一些函数会增加一些额外的堆栈,而且突然之间,你超越了极限 - 最好不要达到堆栈最大值附近的任何地方。
答案 1 :(得分:3)
在Visual C ++中,默认堆栈大小由链接器选项/STACK
(doc)管理。默认情况下,它是1 MB。
请注意,每个新线程都有自己的堆栈,您可以在函数dwStackSize
中使用参数CreateThread
指定初始大小。如果为0,则默认为链接器命令中使用的那个。
关于您的其他问题,无法查询当前/最大堆栈大小。为避免出现问题,最好将堆用于任何重要的内存分配。
答案 2 :(得分:3)
Visual Studio的默认堆栈大小为1MB
,因为Andre说您可以使用std::vector
来避免此问题,或者您可以动态分配内存。您可以使用/F
在Visual Studio上调整堆栈大小。如果没有令人信服的理由在堆栈上分配数据,那么使用其他选项可能更有意义。