C ++ StackOverflowException初始化结构超过63992

时间:2013-01-30 02:33:21

标签: c++ struct stack-overflow

“由于StackOverflowException导致进程终止”是我在运行下面的代码时收到的错误。如果我将63993更改为63992或更小,则没有错误。我想将结构初始化为100,000或更大。

#include <Windows.h>
#include <vector>

using namespace std;

struct Point
{
    double x;
    double y;
};

int main()
{
Point dxF4struct[63993]; // if < 63992, runs fine, over, stack overflow
Point dxF4point;
vector<Point> dxF4storage;

for (int i = 0; i < 1000; i++) {
dxF4point.x = i;    // arbitrary values             
dxF4point.y = i;
dxF4storage.push_back(dxF4point);
}

for (int i = 0; i < dxF4storage.size(); i++) {
    dxF4struct[i].x = dxF4storage.at(i).x;
    dxF4struct[i].y = dxF4storage.at(i).y;
}

Sleep(2000);
return 0;
}

4 个答案:

答案 0 :(得分:3)

你只是耗尽了堆栈空间 - 它不是无限的,所以你必须注意不要耗尽。

三个明显的选择:

  1. 使用std::vector<Point>
  2. 使用全局变量。
  3. 使用动态分配 - 例如Point *dxF4struct = new Point[64000]。不要忘记最后致电delete [] dxF4struct;
  4. 我列出了以上内容,以便我认为更合适。

    [技术上,在其他人指出这一点之前,是的,你可以增加堆栈,但这实际上只是将问题提升到其他地方的水平,如果你坚持下去并在堆栈上放置大型结构,你无论堆叠多大,都会耗尽堆栈]

答案 1 :(得分:1)

Point dxF4struct[63993]; // if < 63992, runs fine, over, stack overflow

那一行,你要在堆栈上分配所有的Point结构。我不确定堆栈的确切内存大小,但默认值大约为1Mb。由于你的结构是16Bytes,并且你正在分配63393,你有16bytes * 63393&gt; 1Mb,它导致堆栈溢出(有趣的发布在堆栈溢出时引发堆栈溢出...)。

因此,您可以告诉您的环境分配更多堆栈空间,或者在堆上分配对象。

如果在堆上分配Point数组,则应该能够轻松分配100,000(假设这不会在内存少于1Mb的嵌入式proc上运行)

Point *dxF4struct = new Point[63993];

正如评论者写的那样,重要的是要知道如果堆上的“新”内存,你有责任“删除”内存。由于这使用数组new[],因此您需要使用相应的数组delete[]运算符。 Modern C ++有一个智能指针,可以帮助管理数组的生命周期。

答案 2 :(得分:1)

增加堆栈大小。在Linux上,您可以使用ulimit来查询和设置堆栈大小。在Windows上,堆栈大小是可执行文件的一部分,可以在编译期间设置。

如果您不想更改堆栈大小,请使用new运算符在堆上分配数组。

答案 3 :(得分:1)

好吧,你得到了一个堆栈溢出,所以分配的堆栈对于这么多的数据来说太小了。你可能会告诉你的编译器为你的可执行文件分配更多的空间,虽然只是在堆上分配它(std :: vector,你已经在使用它)是我的建议。