[英]C++ - stringstream in a recursive function
#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,那么一切就OK了。 在我看來,是否一次不能有太多的stringstream實例?
感謝您的澄清
通常,自動存儲(堆棧)是有界的。 50,000次遞歸很多。
如果您的堆棧只有1 MB,並且整個函數調用的開銷都中斷了20個字節,那么您將破壞堆棧。
stringstream
只是一個負責創建和銷毀事情的類,因此它將在堆棧的頂部之外進行讀取和寫入。
要解決此問題,請不要遞歸50k深。 或者,增加堆棧大小(它將是編譯器標志)。
您是正確的,顯然50000個ostringstream
實例使堆棧ostringstream
。
這是堆棧溢出。 程序的堆棧大小通常受到限制。 您所確定的只是std::string
大小可能小於std::ostringstream
大小,因此它不會很快填充堆棧。 這是循環構造可能優於遞歸的原因之一。
您的堆棧空間不足。 s
是在堆棧上分配的,您正在執行50,000次。 一旦在堆棧上運行OOM,就會崩潰(理應如此)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.