0

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

Code is :

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

如果我们只声明a,那么它会完美执行。如果同时声明a和b,那么它就会终止。谁能建议如何解决这个问题?

4

3 回答 3

6

这两个数组溢出堆栈(假设它们是局部变量)。而是为数组动态分配内存,使用 astd::vector为您管理内存:

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

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

于 2013-04-25T11:20:04.127 回答
4

好的!您的应用中有Stack Overflow在此处输入图像描述

修复示例:

  • 不要使用堆栈 - 使用动态内存分配(堆)

    double* a = new double[150000];

  • 使用 STL 容器,例如vector - 在内部它在堆上分配东西

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

  • 增加堆栈大小(坏主意,但如果您真的需要它,请阅读编译器文档,并查看此处

  • 以某种方式重新设计你的代码
于 2013-04-25T11:40:17.387 回答
2

这个问题有一个解决方案,但它会导致(至少)三种不同的后续解决方案。解决方案是“不要使用大数组作为局部变量,因为它会炸毁堆栈”。

解决方案显然意味着以某种方式更改代码。有几种不同的方法可以做到这一点。

显而易见且直接的解决方案是std::vector<double>改用。

另一种解决方案是使用`

unique_ptr<double[]> a = std::unique_ptr<double[]>(new double[150000]);

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

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

于 2013-04-25T11:38:44.710 回答