본문 바로가기
C++

[C++] Stack overflow (Visual Studio에서 Stack Size 변경 해보기)

by foreverever 2019. 4. 2.
반응형

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가지이다.

 

  1. 함수 내의 지역변수 크기를 크게 선언한 경우
  2. 재귀함수의 무한 호출

 

반응형