Stack overflow는 스택 포인터가 스택의 경계를 넘어설 때 일어난다. 즉, 메모리 영역의 스택범위가 초과한 경우 발생하는 에러다.
메모리에서 스택 영역은 함수 호출 시, 생성되는 지역 변수 및 매개 변수가 저장되는 공간이다.
C++ IDE의 대표적인 visual studio는 스택 사이즈의 디폴트값으로 1MB를 제공해준다.
여기서 한번 실험해 보자.
1MB는 약 1000,000B 이므로, 250,001 크기의 int타입 배열을 main함수에 선언해 보도록 한다. (int타입은 4B 크기를 가진다.)
즉, 배열의 크기는 4B X 250,001개 = 1000,004B를 가진다. 과연 Stack overflow에러가 날까?
결과화면
아무 문제없이 컴파일 되는 것을 볼 수 있다. 이는 1MB는 사실 1000,000B보다 크기 때문이다. (정확히는 1MB = 2^20)
그렇다면, 1MB의 두 배 크기인 2MB로 배열을 선언하면 Stack overflow가 날까?
결과화면
당연히, Stack overflow에러가 발생하는 것을 볼 수 있다. 이는 main함수의 지역변수인 배열의 크기가 스택 사이즈인 1MB보다 큰 2MB로 선언했기 때문이다.
그러면, 스택 사이즈를 늘리면 되는 것 아닌가??
맞다. 스택 사이즈는 최대 램 크기까지 늘릴 수 있다고한다.
한번 2MB의 크기를 수용할 수 있는 사이즈로 늘려보자.
프로젝트 속성 창에서 스택 예약 크기를 넉넉하게 10MB(약 10,000,000B) 정도의 크기로 설정해 보자.
그리고 다시 컴파일 한다면??
문제없이 컴파일이 되는 것을 볼 수 있다.
또한, Stack overflow는 지역변수의 크기 뿐만 아니라, 많은 함수를 계속 호출 할 경우에도 발생한다.
즉, 함수를 무한히 호출 하면 (대표적으로, 종료조건이 없는 재귀함수의 호출) 스택범위를 초과할 수 있다.
결론
Stack overflow의 발생 원인은 크게 2가지이다.
- 함수 내의 지역변수 크기를 크게 선언한 경우
- 재귀함수의 무한 호출
'C++' 카테고리의 다른 글
[C++] cin.eof() (파일 데이터를 끝까지 입력 받기) (3) | 2019.04.26 |
---|---|
[C++] std::find() (문자열 컨테이너에서 특정 문자열 찾기) (0) | 2019.04.21 |
[C++] string::find() (문자열에서 특정 문자 찾기) (0) | 2019.04.21 |