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后,您就会崩溃(正确)