C - 递归函数中的弦线
C++ - stringstream in a recursive function
本文关键字:递归函数 更新时间:2023-10-16
#include <sstream>
#include <string>
using namespace std;
void fRec(int i) {
if (i == 0) {
return;
}
fRec(i - 1);
ostringstream s;
}
int main(int argc, char *argv[]) {
fRec(50000);
return 0;
}
运行时,这会产生:
Segmentation fault (core dumped)
GDB的回溯:
#0 0x000000000040064f in fRec (i=<error reading variable: Cannot access memory at address 0x7fffc75a6f5c>) at strstr.cpp:6
#1 0x000000000040066e in fRec (i=28182) at strstr.cpp:11
#2 0x000000000040066e in fRec (i=28183) at strstr.cpp:11
#3 0x000000000040066e in fRec (i=28184) at strstr.cpp:11
#4 0x000000000040066e in fRec (i=28185) at strstr.cpp:11
#5 0x000000000040066e in fRec (i=28186) at strstr.cpp:11
...
我想问为什么这样做 - 如果我创建一个字符串对象而不是ostringstream,则一切都可以。在我看来,如果不是一次有太多的弦乐实例?
感谢您的澄清
经常自动存储(堆栈)是有界的。50,000个递归很多。
如果您的堆栈仅为1 MB,并且整个功能呼叫上空的呼叫都会断开20个字节,则您将吹堆栈。
stringstream
只是一个在创建和破坏方面做事的班级,因此它将阅读并写入堆栈顶部。
要解决此问题,请勿深入50k。或者,增加堆栈尺寸(它将是编译器标志)。
这是堆栈溢出。程序的堆栈尺寸通常受到限制。您所确定的只是std::string
的尺寸可能比std::ostringstream
小,因此它不会迅速填充堆栈。这是循环构造可以选择递归的原因之一。
您是正确的,显然是50000 ostringstream
实例炸毁了堆栈。
您用完了 stack 空间。s
分配在堆栈上,您正在进行50,000次。一旦您在堆栈上运行OOM后,您就会崩溃(正确)
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 递归函数调用在后台工作
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数