2012-12-18 3 views
0
#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; 
} 

에서 이제 stringstream,이 생산 :C++ - 실행 재귀 함수

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 대신 문자열 객체이면 모든 것이 끝납니다. 한 번에 너무 많은 stringstream 인스턴스가있을 수 없다면 나에게 좋을 것 같습니다. 해명에 대한

덕분에

답변

2

이것은 스택 오버플로입니다. 일반적으로 프로그램의 스택 크기는 제한되어 있습니다. 당신이 결정한 것은 std::string이 아마도 std::ostringstream보다 크기가 작아서 스택을 빨리 채우지 못한다는 것입니다. 이것은 루프 구조가 재귀보다 선호되는 이유 중 하나입니다.

2

당신은 분명히 50000 개 ostringstream 인스턴스가 스택을 날려, 정확합니다.

4

종종 자동 저장 (스택)이 제한됩니다. 50,000 회 재귀가 많이 있습니다.

스택이 단순한 1MB이고 전체 함수 호출 오버 헤드가 20 바이트를 넘으면 스택을 날려 버릴 것입니다.

stringstream은 생성 및 삭제시 작업을 수행하는 클래스이므로 스택 맨 위로 읽고 쓰게됩니다.

이 문제를 해결하려면 깊이 50K를 반복하지 마십시오. 또는 스택 크기를 늘리십시오 (컴파일러 플래그가됩니다).

+0

설명해 주신 분께 감사드립니다! – Ferrard

1

너는 STACK 공간이 부족합니다. s은 스택에 할당되며 50,000 번 수행하고 있습니다. 스택에서 OOM을 실행하면 충돌이 발생합니다 (정당하게 그렇습니다).