5000+ 深度递归时函数堆栈溢出
function stack overflow when 5000+ deep recursion
此函数适用于较小的数组。但是,当给定非常大的"int"数组时,它会惨败。我抬头发现是内存不足的堆栈导致了问题,因为它无法分配足够的空间来容纳所有内部循环的变量。那么如何解决这个问题呢?
void subsetSums(vector<int> arr, int l, int r, int sum=0) {
if(l > r){
cout << sum << ", ";
return;
}
subsetSums(arr, l+1, r, sum+arr[l]);
subsetSums(arr, l+1, r, sum);
}
int main(){
vector<int> arr(500000, 1);
subsetSums(arr, 0, arr.size()-1);
return 0;
}
我现在只想"热修复"这个问题。然后,也许我会找到这个问题的最佳解决方案。
您可以执行三种不同操作:
- 减少堆栈使用量
当它们完全没有变化时,您可以创建一个将这些成员作为成员的结构,并将对该结构的引用作为参数传递,而不是为每个函数调用传递向量和"r"的副本。如果你不怕全局变量,你可以把这些变量变成全局变量,而不是将它们作为函数参数传递,尽管在这种情况下,风格警察可能会来带你走。
此外,在某些编译器上,未优化或调试版本将使用更多堆栈,因此请尝试发布版本目标或启用优化。
- 增加堆栈大小
执行此操作的方法取决于编译器和平台。以下是使用 gcc 和 Linux 的方法:在使用 GNU 编译器编译期间更改 Linux 中 C++ 应用程序的堆栈大小
- 更改为非递归算法
通常有一种更快、更节省内存的算法来执行与递归算法相同的操作。在这种情况下,这是显而易见的。这通常是在实际生产代码中要做的事情。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 如何在Windows上报告堆栈缓冲区溢出
- 如何抑制来自 gcc 中地址清理器的堆栈缓冲区溢出
- 声明大数组时堆栈/堆溢出
- c++中栈溢出和分段错误的危险