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