1

“由于 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

4 回答 4

3

您只是用完了堆栈空间-它不是无限的,因此您必须注意不要用完。

三个明显的选择:

  1. 利用std::vector<Point>
  2. 使用全局变量。
  3. 使用动态分配 - 例如Point *dxF4struct = new Point[64000]。最后别忘了打电话delete [] dxF4struct;

我按照我认为更可取的顺序列出了上述内容。

[从技术上讲,在其他人指出之前,是的,您可以增加堆栈,但这实际上只是将问题提升到其他地方,如果您继续这样做并将大型结构放在堆栈上,您将用完堆栈最终无论你做多大的堆栈]

于 2013-01-30T02:44:16.713 回答
1
Point dxF4struct[63993]; // if < 63992, runs fine, over, stack overflow

那条线,你在堆栈上分配你所有的 Point 结构。我不确定堆栈的确切内存大小,但默认值约为 1Mb。由于您的结构是 16 字节,并且您正在分配 63393,因此您有 16 字节 * 63393 > 1Mb,这会导致堆栈溢出(有趣的是在堆栈溢出时发布堆栈溢出...)。

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

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

Point *dxF4struct = new Point[63993];

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

于 2013-01-30T02:41:23.823 回答
1

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

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

于 2013-01-30T02:42:39.670 回答
1

好吧,您遇到了堆栈溢出,因此分配的堆栈对于这么多数据来说太小了。您可能会告诉您的编译器为您的可执行文件分配更多空间,尽管我建议只在堆上分配它(std::vector,您已经在使用它)。

于 2013-01-30T02:43:10.143 回答