C++을 이번에 사용하게 되면서 포인터 사용 시 잘 몰랐던 부분 정리.
MyClass* pA = new MyClass();
MyClass* pB = pA; // pB는 pA와 같은 객체를 가리킨다.
위 와 같이 MyClass의 포인터 인스턴스를 2개 생성하고 pB에 pA의 주소를 할당.
delete pA; // pA가 가리키는 객체를 메모리에서 해제.
pA = nullptr;
나는 pA 를 메모리 해제하고 nullptr를 넣으면 pB도 null를 가리킬 줄 알았는데 그게 아니었음.
pA가 가리키는 객체는 메모리에서 해제되지만, pB는 여전히 그 메모리 주소를 가리키고 있는 상태로 남아 있게 되는거였음.
이 상태에서 pB를 사용하려고 하면, 이미 해제된 메모리를 참조하는 것이 되어 정의되지 않은 동작이 발생한다고 한다. 이러한 상태를 "dangling pointer"라고 하더라..
그래서
delete pA; // pA가 가리키는 객체를 메모리에서 해제.
pA = nullptr; //
// pB도 nullptr로 설정
pB = nullptr;
이렇게 pB도 nullptr을 할당해줘야 안전하다고 한다.