2

我尝试在堆栈上创建一个 ~975KB 数组,但它崩溃了。

const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash

这似乎是一个非常小的空间。在我初始化变量之前,有没有办法知道有多少可用空间(总空间和当前空间)?

4

3 回答 3

6

堆栈在几乎所有系统中都是有限的。允许多大取决于操作系统/编译器组合。将非常大量的数据放在堆栈上是一个糟糕的主意。要么使用 C++ 标准类型(例如vector),要么使用您自己的动态内存分配。您永远不知道其他函数何时会添加一些额外的堆栈,并且突然之间,您会超出限制-最好不要接近堆栈的最大大小。

于 2013-07-25T13:23:25.333 回答
3

Visual Studio 的默认堆栈大小是1MB,正如 Andre 所说,您可以使用它std::vector来避免这个问题,或者您可以动态分配内存。您可以使用 /F. 如果没有令人信服的理由在堆栈上分配数据,那么使用另一个选项可能更有意义。

于 2013-07-25T13:22:18.623 回答
3

在 Visual C++ 中,默认堆栈大小由链接器选项/STACK (doc)管理。默认情况下为 1 MB。

请注意,每个新线程都有自己的堆栈,您可以dwStackSize在 function 中使用参数指定初始大小CreateThread。如果它是 0,它将默认为链接器命令中使用的那个。

关于您的其他问题,无法查询当前/最大堆栈大小。为避免出现问题,最好将堆用于任何重要的内存分配。

于 2013-07-25T13:21:59.873 回答