Dangling Pointer

C++/C++ 2021. 2. 19. 04:16 |
int main() {

	int* pA = new int(5); // pA는 Heap상의 데이터 주소를 가리킴
	int* pB = NULL;

	pB = pA; // pB가 가리키는 대상을 pA가 가리키는 대상으로 참조복사 (Shallow Copy)

	cout << *pA << endl;
	cout << *pB << endl;

	delete pA;// pA가 가리키는 메모리를 해제 함
	delete pB;// pB가 가리키던 메모리는 이미 해제되었으므로 오류 발생
    
    //pB가 가리키는 메모리는 delete pA; 수행으로 이미 해제되었기 때문에 또 해제하려고하면 오류발생
	//pB처럼 메모리를 낭비하는 의미 없는 포인터를 Dangling Pointer 라고 부름(메모리 누수 요소)    
}

위의 코드는 크래쉬가 발생한다.

 

pA와 pB가 가리키는 메모리의 위치가 같은데 이미 해제된 메모리에 다시 delete를 수행하려하면

 

정의되지 않은 행동을 했으므로 중단점을 트리거한다는 오류를 뱉으면서 프로젝트가 오류가 발생한 것이다.

 

사실 위의 코드에서 delete pB; 부분은 필요가 없는 부분이다.

 

delete 키워드는 pointer를 delete하는 것이 아니라 pointer가 가리키는 것( Heap에 할당된 메모리)을 해제하는 것이다.

 

따라서 delete 수행 후에도 pA와 pB는 여전히 같은 메모리 주소를 가리키고 있겠지만 그곳에는 더이상 아무것도 없으며 해당 프로그램에서 접근권한을 상실하기 때문에 접근할 수도 없다.

 

만약 다시 pA=new int(6); 같은 것으로 다시 메모리를 할당해준다면 pA와 pB에서 다시 접근이 가능해질 것이다.

 

 

 

추가로 C++ 언어 프로그래밍 원칙 중에 ' All member must be initialized '라는 것이 있다.

 

이 원칙에 따라 항상 포인터 선언시 NULL 혹은 nullptr를 대입해주어 위와같은 오류의 발생을 방지하자.

Posted by Elan
: