我正在开发一个代码,其中需要声明大小为 150000 的双精度数组,并且当声明一个数组时,代码运行成功。如果我们声明两个数组,则在执行时它终止抛出异常。
Code is :
double a[150000];
double b[150000];
如果我们只声明a,那么它会完美执行。如果同时声明a和b,那么它就会终止。谁能建议如何解决这个问题?
我正在开发一个代码,其中需要声明大小为 150000 的双精度数组,并且当声明一个数组时,代码运行成功。如果我们声明两个数组,则在执行时它终止抛出异常。
Code is :
double a[150000];
double b[150000];
如果我们只声明a,那么它会完美执行。如果同时声明a和b,那么它就会终止。谁能建议如何解决这个问题?
这两个数组溢出堆栈(假设它们是局部变量)。而是为数组动态分配内存,使用 astd::vector
为您管理内存:
std::vector<double> a(150000);
std::vector<double> b(150000);
即使std::vector
实例在堆栈上,也会在std::vector
内部为堆上的数据动态分配内存,避免堆栈溢出。
好的!您的应用中有Stack Overflow!
修复示例:
这个问题有一个解决方案,但它会导致(至少)三种不同的后续解决方案。解决方案是“不要使用大数组作为局部变量,因为它会炸毁堆栈”。
解决方案显然意味着以某种方式更改代码。有几种不同的方法可以做到这一点。
显而易见且直接的解决方案是std::vector<double>
改用。
另一种解决方案是使用`
unique_ptr<double[]> a = std::unique_ptr<double[]>(new double[150000]);
第三个,有时也是一个很好的解决方案,是制作a
和b
全局变量。
还有其他几种变体,但它们通常是同一主题的变体,只是略有不同。在您的情况下最好的方法实际上取决于您的其余代码在做什么。我会从 开始std::vector<double>
,但确实存在其他替代方案,如果由于某种原因这是一个不合适的解决方案。