Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++ 프로그램 충돌의 원인


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);
}