C++ 프로그램의 비정상적인 동작은 종종 프로그램 충돌로 이어집니다. Segmentation fault, Aborted, Floating point exception 등과 같은 문제가 발생했을 수 있습니다. 다음은 C++ 프로그램 충돌의 원인을 이해하는 데 도움이 될 수 있는 샘플 프로그램입니다.
예외
C++의 예외는 프로그램이 비정상적인 조건을 만났을 때의 응답입니다. 이러한 예외가 try-catch 블록을 사용하여 제대로 처리되지 않으면 프로그램이 충돌합니다. 0으로 나누기 예외로 인한 다음 프로그램 충돌 -
예시
#include <iostream> int main(){ int num1=10; int num2=0; int quotient=num1/num2; printf("\n Quotient is: %d",quotient); return 0; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Floating point exception (core dumped)
버퍼 오버플로
버퍼는 임시 저장 영역입니다. 버퍼에 데이터를 쓰는 동안 프로그램이 버퍼가 저장할 수 있는 크기를 초과하면 추가 데이터가 버퍼의 경계를 벗어납니다. 데이터는 인접한 메모리 위치에 덮어씁니다. 다음 프로그램은 입력이 크기를 초과할 때 동작을 변경합니다. 변수 num은 보유할 수 있습니다.
예시
#include <iostream> #include <string.h> int main(){ int num=100; std::cout<<"\nValue for num:"<<num; char c[2]; strcpy(c,"abcdefghijklmnopqrstuvwxyz"); std::cout<<"\nValue for c:"<<c; return 0; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Value for num:100 Segmentation fault (core dumped)
스택 오버플로
스택 오버플로 문제는 호출 스택 포인터가 스택 경계를 초과할 때 발생합니다. 스택은 제한된 공간으로 구성됩니다. 프로그램이 스택에서 사용할 수 있는 것보다 더 많은 공간을 사용하면 스택이 오버플로되어 프로그램이 중단된다고 합니다. 가장 흔한 원인은 무한 재귀입니다.
다음 프로그램에는 factorial() 함수에 대한 무한 호출이 포함되어 있습니다. 이 경우 return 문은 적절하지 않습니다.
예시
#include <iostream> #include <string.h> int factorial(int num){ if(num==0) return 1; else return(factorial(num)); } int main(){ int n=10; int fact=factorial(n); std::cout<<fact; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Segmentation fault (core dumped)
세그먼테이션 오류
프로그램이 자신에게 속하지 않은 메모리 위치에 액세스하려고 할 때 분할 오류 또는 코어 덤프가 발생합니다. 다음 프로그램에서 포인터 str은 메모리를 무한정 증가 및 추가합니다.
예시
#include <iostream> int main(){ char *str; char name[]="iostream"; str=name; while(1) (*str++)='a'; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Segmentation fault (core dumped)
메모리 누수
동적으로 할당된 메모리가 할당 해제되지 않을 때 메모리 누수가 발생합니다. 메모리가 더 이상 사용되지 않을 때 메모리를 해제해야 합니다. 계속해서 계속해서 메모리를 할당하면 시간이 지남에 따라 이러한 메모리 누수가 증가하고 결국 프로그램이 충돌하게 됩니다. 아래와 같이 잘못된 코드를 반복하면 메모리 누수가 발생합니다 -
예시
#include <iostream> int main(){ int *node; node = (int *) malloc(9999999); // free(node); }