C+읽 기 접근 권한 충돌 로 인 한 이상 문제 의 원인 분석

C++로 코드 를 쓸 때"이상 발생:읽 기 접근 권한 충돌"이 자주 발생 합 니 다.이러한 잘못된 힌트 는 이런 상황 이 발생 하 는 원인 은 주로 두 가지 가 있다.
1.방문 배열 의 경 계 를 넘 습 니 다.
선형 표 의 순서 구조,예 를 들 어 순서 표,대기 열,스 택 등 을 사용 하여 배열 로 데 이 터 를 저장 할 때 데 이 터 를 읽 을 위치 가 현재 배열 의 길 이 를 초과 하면 배열 이 경 계 를 넘 는 상황 이 발생 합 니 다.
그러나 이것 은 컴 파일 오 류 를 일 으 키 지 않 습 니 다.즉,컴 파일 러 는 컴 파일 할 때 배열 의 경 계 를 넘 었 다 고 지적 하지 않 습 니 다.이 때 는'0 errors,0 warnings'일 수도 있 습 니 다.

코드 에 bug 가 없어 서 다행 이지 만 실행 되면 접근 권한 충돌 의 이상 을 던 집 니 다.
예 를 들 어 다음 단락 의 대기 열과 창고 작업

struct Stack              //           
{
	int data[maxSize];    //           
	int top;              //      
};

struct Queue              //            
{
	int elements[2000];   //       2000           
	int front;            //      
	int rear;             //      
};

while (queueA->front < queueA->rear || queueB->front < queueB->rear) 
{
	queueA->front++;
	inStack(stack, queueA->elements[queueA->front]);
	outStack(stack, queueA);
	queueB->front++;
	inStack(stack, queueB->elements[queueB->front]);
	outStack(stack, queueB);
}
//inStack           
//outStack           ,         
컴 파일 에 성공 한 것 은 잘못 되 지 않 았 으 나 실행 후 읽 기 접근 권한 충돌 의 이상 을 던 졌 습 니 다.

우 리 는 이때 부분 변수의 상 태 를 살 펴 보면 대기 열 A 의 팀 헤드 포인터 와 팀 꼬리 포인터 가 모두 이상 한 하 표를 가리 키 고 있 음 을 알 수 있다.

이 는 분명히 경 계 를 넘 는 상황 이 발생 했다.길이 가 2000 인 배열 이기 때문에 아래 표 시 된 수 치 는 0~1999 일 것 이다.
나중에 while 순환 판정 조건 에서 오류 가 발생 한 것 을 발견 했다.본 의 는 A,B 사이 의 임의의 대기 열 에 있 는 요소 가 비어 있 을 때 순환 을 뛰 어 넘 는 것 입 니 다.그러나 판정 조건 의 논 리 를 논리 적 으로 잘못 쓰 거나 순환 을 뛰 어 넘 지 못 하 게 만 들 었 습 니 다.최종 대기 열 A 의 팀 헤드 포인터 와 팀 꼬리 지침 은 끊 임 없 는 순환 작업 에서 배열 경 계 를 초과 하여 읽 기 접근 권한 충돌 의 이상 이 발생 했 습 니 다.

while 의 판정 조건 을 수정 하면 프로그램 이 정상적으로 실 행 될 수 있 습 니 다.
따라서 접근 권한 충돌 을 읽 는 알림 을 만 났 습 니 다.배열 의 데 이 터 를 읽 을 때 이상 이 발생 하면 어떤 조작 이 잘못 되 어 방문 배열 이 경 계 를 넘 었 는 지 우선 고려 할 수 있 습 니 다.
2.빈 포인터 이상
이것 은 주로 포인터 로 데 이 터 를 읽 을 때 발생 한다.예 를 들 어 링크 를 사용 하 는 과정 에서 발생 한다.
예제:링크 의 조작

struct Node              //         
{
	int data;
	Node* next;
};

LinkListInvert::LinkListInvert(int arg[],int n)
{                            //              
	Node* r = first;
	Node* s = nullptr;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = arg[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}
코드 컴 파일 에 오류 가 없습니다.실행 후 읽 기 접근 권한 이상 이 발생 합 니 다.

first 포인터 가 초기 화 되 지 않 아 first 포인터 가 빈 포인터 가 되 어 불확실 한 값 을 가리 키 고 그 다음 에 진행 되 는 동작 임 을 알 수 있 습 니 다.

	Node* r = first;
r 포인터 도 빈 포인터 가 되 었 고 다음 작업 을 할 때 읽 기 권한 충돌 의 이상 을 던 졌 습 니 다.

LinkListInvert::LinkListInvert(int arg[],int n)
{
	first = new Node;           //        , first   
	Node* r = first;
	Node* s = nullptr;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = arg[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}
수정 하 는 방식 도 간단 하 다.first 지침 을 초기 화하 면 실행 에 성공 할 수 있다.
포인터 가 초기 화 되 지 않 아 발생 하 는 읽 기 접근 권한 이상 과 유사 하 며,0xCCCCCC,0xCDCDCD 와 같은 이상 알림 도 제공 합 니 다.

물론 링크 뿐만 아니 라 빈 포인터 이상 은 데이터베이스 조회,포인터 가 초기 화 되 지 않 았 을 때 도 빈 포인터 이상 이 발생 할 수 있 습 니 다.
총결산
C++읽 기 권한 충돌 로 인 한 이상 문 제 를 일 으 키 는 이 글 을 소개 합 니 다.더 많은 관련 C+읽 기 권한 충돌 내용 은 이전 글 을 검색 하거나 아래 글 을 계속 찾 아 보 세 요.앞으로 도 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기