댕글링 포인터(Dangling Pointer)란?
댕글링 포인터는 적절한 타입의 유효한 객체를 가리키고 있지 않은 포인터를 말한다. 예를 들어 이미 할당 해제된 메모리를 포인터가 계속 가리키고 있다면 해당 포인터는 댕글링 포인터이다.
예를 들어 메모리에 할당된 하나의 객체를 가리키는 두 개의 포인터 ptr1, ptr2가 있다고 하자. 이때 ptr1만을 free 하여 메모리를 해제해주면 ptr2는 Dangling Pointer가 돼버린다.
댕글링 포인터 해결법
1. Tombstone Approach
첫번째 방법은 tombstone(비석)이라고 불리는 특별한 cell을 설정해 포인터가 할당된 객체를 직접 가리키지 않고 비석을 통해 가리키도록 하는 방법이다.
예를 들어 [그림 3]처럼 ptr1을 free 한다면, 객체는 반환되고 해당 객체를 가리키던 비석은 nil이 된다. 만약 nil을 가리키는 포인터가 있다면 이것이 오류임을 검출할 수 있게 된다.
비석 방법은 공간 낭비와 시간 낭비가 심하다.
2. Locks-and-key Approach
두 번째 방법은 Locks-and-key 방법이다. 각 포인터는 (key, value)의 형태로 나타내어지는데, 이때 key는 정수 형태를 가진다. 마찬가지로 메모리에 할당된 객체는 (lock, value)의 형태로 나타내어진다. 이때 포인터를 역참조 하기 위해서는 포인터의 key와 변수의 lock 값이 동일해야 한다. 만약 동일하지 않다면 오류라고 판단하게 된다.
예를 들어 [그림 4]처럼 동일한 객체를 가리키는 포인터 2개가 있을 때(동일한 객체를 가리키는 포인터는 동일한 key값을 가짐), 메모리를 해제하면 lock의 값이 key값과 다르도록 변경된다. 따라서 다른 포인터는 안전하게 비활성화된다.