C++ StAccOffFoULT异常初始化结构63992

C++ StAccOffFoULT异常初始化结构63992,c++,struct,stack-overflow,C++,Struct,Stack Overflow,由于StackOverflowException是我运行下面代码时收到的错误,进程被终止。如果将63993更改为63992或更小,则不会出现错误。我想将结构初始化为100000或更大 #include <Windows.h> #include <vector> using namespace std; struct Point { double x; double y; }; int main() { Point dxF4struct[63993];

由于StackOverflowException是我运行下面代码时收到的错误,进程被终止。如果将63993更改为63992或更小,则不会出现错误。我想将结构初始化为100000或更大

#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;
}
正如一位评论者所写,重要的是要知道,如果您在堆上添加了新内存,那么删除内存是您的责任。由于这使用数组new[],因此需要使用相应的数组delete[]运算符。现代C++有一个智能指针,它将有助于管理数组的生存期。
正如一位评论者所写,重要的是要知道,如果您在堆上添加了新内存,那么删除内存是您的责任。由于这使用数组new[],因此需要使用相应的数组delete[]运算符。现代C++有一个智能指针,它有助于管理数组的生存期。

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


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

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


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

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

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

您的堆栈空间已经用完了-它不是无限的,所以您必须小心不要用完

三个显而易见的选择:

使用std::vector 使用全局变量。 使用动态分配-例如点*dxF4struct=新点[64000]。不要忘记调用delete[]dxF4struct;最后。 我列出了以上内容,以便我认为更可取


[从技术上讲,在其他人指出这一点之前,是的,你可以增加堆栈,但这实际上只是将问题提升到其他地方的某个级别,如果你继续这样做,并在堆栈上放置大型结构,那么不管你制作的堆栈有多大,最终都会耗尽堆栈]

您只是耗尽了堆栈空间-它不是无限的,所以您必须小心不要耗尽

三个显而易见的选择:

使用std::vector 使用全局变量。 使用动态分配-例如点*dxF4struct=新点[64000]。不要忘记调用delete[]dxF4struct;最后。 我列出了以上内容,以便我认为更可取


[从技术上讲,在其他人指出这一点之前,是的,你可以增加堆栈,但这实际上只是将问题提升到其他地方的一个级别,如果你继续这样做,并在堆栈上放置大型结构,那么不管你使堆栈多么大,最终都会耗尽堆栈]

而不是点*dxF4struct=新点[63993];,为什么不std::vector dxF4struct63993?真的没有理由。只是想给出一个在堆上显式分配的示例。请记住,如果以这种方式分配内存,通常会希望在分配后删除内存。处理完内存后,调用delete[]dxF4struct。请注意delete[]有括号。由于您要删除数组,因此需要这种形式的删除。否则,我建议Mats Peterson的回答,因为使用std::vector将为您自动清理,因此通常认为更安全。而不是点*dxF4struct=新点[63993];,为什么不std::vector dxF4struct63993?真的没有理由。只是想给出一个在堆上显式分配的示例。请记住,如果这样做,通常会在分配内存后删除内存。处理完内存后,请调用delete[]dxF4struct。请注意delete[]有括号。由于您要删除数组,因此需要这种形式的删除。否则,我建议Mats Peterson的回答,因为使用std::vector将为您自动清理,因此通常认为更安全。您能更具体地说明选项1吗?我是否已经在main的第三行中使用了std::vector?我不知道我不知道为什么你认为你需要dxF4struct和vector——我没有写这段代码……我的观点是,如果你想存储大量的对象,你不应该在堆栈上创建一个大数组。vector将从堆中自动分配内存
当向量不再使用时,再次取消分配它[超出范围]。您能更具体地说明选项1吗?我还没有在main的第三行使用std::vector吗?我不知道为什么你认为你需要dxF4struct和vector-我没有写这段代码。。。我的观点是,如果你想存储大量的对象,你不应该在堆栈上创建一个大数组。vector将从堆中分配内存,并在向量不再使用时自动重新分配内存[超出范围]。
Point dxF4struct[63993]; // if < 63992, runs fine, over, stack overflow
Point *dxF4struct = new Point[63993];