声明大小为150000的双数组时出错?

时间:2013-04-25 11:18:56

标签: c++

我正在开发一个代码,其中需要声明大小为150000的double的数组,并且当一个数组被声明时代码正在成功运行。如果我们声明两个数组,那么在执行时它会终止抛出异常。

Code is :

double a[150000];
double b[150000];

如果我们声明一个然后它就会完美地执行。如果声明了a和b,那么它就会终止。 任何人都可以建议如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

这两个数组是overflowing the stack(假设它们是局部变量)。为数组动态分配内存,使用std::vector为您管理内存:

std::vector<double> a(150000);
std::vector<double> b(150000);

即使std::vector实例在堆栈上,std::vector也会在内部为堆上的数据动态分配内存,从而避免堆栈溢出。

答案 1 :(得分:4)

好!你的应用中有Stack Overflowenter image description here

修复示例:

  • 不要使用堆栈 - 请使用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]);

第三个,有时是一个很好的解决方案,就是制作ab个全局变量。

还有其他几种变体,但它们通常是同一主题的变体,只是略有不同。在您的情况下,最好的是取决于您的其余代码正在做什么。我从std::vector<double>开始,但是其他替代品确实存在,如果出于某种原因这是不合适的解决方案。