SMALL
발생 원인
프로그램을 실행 중에 가끔 아래와 같은 에러로 인해 프로그램이 Dead 되는 경우가 있다. 아래 케이스 같은 경우에 문제가 발생하게 된 원인은 Stack Overflow 말 그대로 Stack 영역의 범위기 지정된 범위를 넘어섰기 때문이다. 즉 Stack 공간이 부족하게 되어서 발생한 문제이다.

해결 방법
이와 같은 문제가 실행 중에 발생하게 되는 원인은 우리가 프로그램을 실행 중에 호출되는 함수 스택 및 함수 내에서 할당되는 변수등이 Stack에 저장이 된다. 그때 어떤 함수를 실행하는 시점에 프로그램에서 할당한 Stack 영역보다 더 많은 메모리가 필요하게 되면서 발생하는 문제이다. 이와 같은 경우 문제를 해결할 수 있는 방법은 2가지이다.
- 불필요한 함수 호출 및 변수를 정리한다.
- 내가 구현한 함수들이 성질별로 잘 분리되어 있는지, 즉 하나의 기능만 동작하는 확인 후 여러 기능이 복합적이라면 함수를 분리한다.
- 함수 내에서 사용하는 변수가 클래스 전체에서 공유할 수 있는 데이터라면 굳이 매개변수로 서로 주고받지 않고 멤버 변수로 관리한다.
- 동적 할당을 적극 활용한다. = 동적 할당은 Stack이 아닌 Heap에 적재된다.
- 고려해야 할 점 = 성능 적인 부분 Stack 기본적으로 Heap보다 빠르며, 할당 해제를 빈번하게 할 경우 성능저하를 불러일으킬 수 있으니 잘 판단하여 사용하여야 한다.
- 프로그램 Stack 공간을 늘린다.
- 불필요한 함수 호출 및 변수를 정리한 후에도 더 이상 줄일 수 없다고 판단이 되는 경우에만 사용하는 것이 좋다.
- 링커->시스템->스택 예약 크기 or 커밋 크기 = 필요한 만큼 늘림
스택 예약 크기와 커밋 크기 차이
- 스택 예약 크기 : 프로세스를 시작할 때 확보하는 Stack 크기를 의미한다.하지만 페이지 테이블만 할당될 뿐 실제 메모리와는 연결이 되지 않는다. ※ 페이지 테이블 = 논리주소의 페이지를 물리주소의 프레임으로 Mapping시켜주는 정볼르 담고 있는 테이블
- 스택 커밋 크기 : 프로세스 시작 시 Stack 크기 확보를 위해 실제 메모리와 연결되는 크기
나의 생각
단순 현재 문제를 해결하는 것도 좋지만, 그 문제의 원인이 먼지 그리고 그 원인과 연관된 개념들은 먼지 이해를 하고 넘어가는 것이 좋다고 생각한다. 하지만 협업에서 일을 하다 보면 다들 검색 후 문제만 해결하고 이해를 하지 않고 넘어간다. 그 런 개발자들은 나중에 똑같은 실수를 지속적으로 반복한다. 그러한 관점에서 나는 앞으로 문제 해결 방법과 관련된 내용을 간단하게 설명하고 넘어가고자 한다.
'C++ 개발이야기 > 문제 해결' 카테고리의 다른 글
C++ LoadLibrary Null 반환 문제 (0) | 2025.04.22 |
---|