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)
세그먼테이션 오류
프로그램이 자신에게 속하지 않은 메모리 위치에 액세스하려고 할 때 분할 오류 또는 코어 덤프가 발생합니다. 다음 프로그램에서 포인터는 메모리를 무한정 증가 및 추가합니다.
예시
#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);
}