C++에서 세분화 오류 수정

Zeeshan Afridi 2023년10월12일
  1. C++의 분할 오류
  2. C++에서 세분화 오류의 원인
  3. C++에서 세분화 오류 수정
C++에서 세분화 오류 수정

이 문서에서는 C++의 세그먼테이션 오류에 대해 설명하고 이 문제를 해결하기 위한 솔루션을 제공합니다.

C++의 분할 오류

C++의 세그멘테이션 오류는 프로그램이나 시스템이 도달할 수 없는 일부 메모리에 액세스하려고 할 때 발생합니다. 런타임 중에 프로그램 충돌을 일으키는 일반적인 조건입니다.

C++에서 세그먼테이션 오류의 원인 뒤에 있는 이유는 프로그램 또는 시스템 제한을 넘어 잘못된 메모리 위치에서 데이터를 쓰고 읽으려고 하기 때문입니다.

예제 코드:

#include <iostream>
using namespace std;

int main(void) {  // This program will crash becasue it has segmentation fault
  int *i = NULL;
  *i = 10;  // This line causes the error
  cout << *i << endl;
  return 0;
}

출력:

Segmentation fault

이 프로그램에서 *i =10; 문은 NULL*i를 역참조하기 때문에 세그먼테이션 오류가 발생합니다. 허용되지 않는 NULL을 수정하려고 합니다. 따라서 세분화 오류가 있습니다.

C++에서 세분화 오류의 원인

일반적으로 프로그램 메모리는 서로 다른 세그먼트로 나뉩니다.

  1. 텍스트 세그먼트는 프로그램 명령문 및 명령어에 사용됩니다.
  2. 데이터 세그먼트는 컴파일 타임에 변수 및 배열 정의를 담당합니다.
  3. 스택 세그먼트는 서브루틴 및 함수(로컬 변수)에 정의된 임시 변수를 담당합니다.
  4. 힙 세그먼트는 Fortran의 allocate 및 C의 malloc과 같은 함수에 의해 런타임 동안 변수 할당에 사용됩니다.

액세스 위반이라고도 하는 세그먼테이션 오류의 원인은 초기화되지 않은 메모리에 액세스하고 한계를 넘어 데이터를 읽고 쓰는 것입니다. 다음은 C++에서 세그먼테이션 오류를 일으키는 몇 가지 일반적인 이유 목록입니다.

  1. 배열의 유효하지 않은 인덱스에 액세스
  2. NULL 포인터 및 해제된 메모리 역참조
  3. 초기화되지 않은 메모리 역참조
  4. &의 주소 및 역참조 * 연산자의 잘못된 사용;
  5. 스택 오버플로;
  6. 읽기 전용 메모리에 쓰기.

C++에서 세분화 오류 수정

C++에서 이러한 세그멘테이션 오류를 방지하기 위해 사전 활성 및 사전 활성 전략을 모두 사용하여 세분화 오류를 극복했습니다. 다음은 세분화 오류를 방지하는 데 사용할 수 있는 몇 가지 솔루션입니다.

해결책 1:

다음은 세그먼테이션 오류를 추적하고 디버그하기 위해 수행할 수 있는 몇 가지 단계입니다.

  1. -go로 코드를 컴파일합니다. 이것은 바이너리 파일에 디버그 기호를 제공합니다.
  2. 다음으로 gdb 명령을 사용하여 gdb 콘솔을 엽니다.
  3. 파일을 사용하고 콘솔에서 코드의 바이너리 파일을 전달합니다.
  4. 이제 애플리케이션을 실행하고 인수를 전달하여 시작하십시오.
  5. 세그먼테이션 오류를 일으키는 일부 코드를 사용하십시오.
  6. 마지막 단계는 gdb 콘솔에 bt를 입력하여 결함 추적을 얻는 것입니다.

해결책 2:

때로는 프로그램 충돌이 문제의 실제 원인이 아닙니다. 아마도 이전 시점에서 메모리가 손상되었을 수 있지만 손상이 나타나는 데 시간이 좀 걸렸습니다. 포인터 초기화 및 할당을 살펴보십시오.

해결책 3:

문제가 발생하기 전에 문제를 해결하려고 합니다. 다음과 같은 능동적인 오류 처리 전략을 사용하십시오.

  1. 프로그램 코드를 자주 컴파일하고 실행하십시오. 결함을 쉽게 찾을 수 있도록 도와줍니다.
  2. 거의 메모리로 직접 작업하지 않는 저수준/오류 발생 가능성이 있는 루틴을 캡슐화하십시오.
  3. 테스트 세트를 유지 관리하고 작동 중인 것과 작동하지 않는 것을 분석하십시오. 이렇게 하면 문제 위치를 파악하는 데 도움이 됩니다.

해결책 4:

대부분 포인터에 문제가 있으며 올바르게 초기화되지 않은 포인터를 사용하고 있을 가능성이 높지만 이중 해제로 메모리 관리를 엉망으로 만들 수도 있습니다.

그리고 초기화되지 않은 포인터를 피하려면 프로그램의 끝과 후반부에 포인터를 선언하려고 하지만 이것이 항상 가능한 것은 아닙니다. NULL 또는 0으로 초기화하십시오.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn