我正在开发一个代码,其中需要声明大小为150000的double的数组,并且当一个数组被声明时代码正在成功运行。如果我们声明两个数组,那么在执行时它会终止抛出异常。
Code is :
double a[150000];
double b[150000];
如果我们声明一个然后它就会完美地执行。如果声明了a和b,那么它就会终止。 任何人都可以建议如何解决这个问题?
答案 0 :(得分:6)
这两个数组是overflowing the stack(假设它们是局部变量)。为数组动态分配内存,使用std::vector
为您管理内存:
std::vector<double> a(150000);
std::vector<double> b(150000);
即使std::vector
实例在堆栈上,std::vector
也会在内部为堆上的数据动态分配内存,从而避免堆栈溢出。
答案 1 :(得分:4)
好!你的应用中有Stack Overflow!
修复示例:
不要使用堆栈 - 请使用dynamic memory allocation (heap):
double* a = new double[150000];
使用STL容器,例如vector - 在内部分配堆上的东西
std::vector<double> a(150000);
增加堆栈大小(不好主意,但如果你真的需要它,请阅读编译器文档,并查看here)
答案 2 :(得分:2)
这个问题有一个解决方案,但它会导致(至少)三种不同的后续解决方案。解决方案是“不要将大型数组用作局部变量,因为它会炸毁堆栈”。
解决方案显然意味着以某种方式更改代码。有几种不同的方法可以做到这一点。
明显而直接的解决方案是使用std::vector<double>
代替。
另一种解决方案是使用`
unique_ptr<double[]> a = std::unique_ptr<double[]>(new double[150000]);
第三个,有时是一个很好的解决方案,就是制作a
和b
个全局变量。
还有其他几种变体,但它们通常是同一主题的变体,只是略有不同。在您的情况下,最好的是取决于您的其余代码正在做什么。我从std::vector<double>
开始,但是其他替代品确实存在,如果出于某种原因这是不合适的解决方案。