簡體   English   中英

C ++-遞歸函數中的字符串流

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM