[C/C++]Dangling Pointer

HW·2024년 1월 17일
0

C/C++

목록 보기
4/5
post-thumbnail

서론

Beyond 프로젝트에서,
COption클래스의 멤버,
optionListflagList를 함수에서 동적 할당을 한 후,
소멸자가 아닌 다른 함수에서 동적 해제를 했습니다.


본론

생성자를 기본 생성자로 만들고, 소멸자는 empty하게 비워둔 채로 (명시적이 아닌, 암묵적으로) 정의했습니다.
이 때, 소멸자는 컴파일러에서 기본 소멸자 (Default Destructor)를 생성해줍니다.
그러나, 기본 소멸자는 동적 해제를 장담할 수 없습니다.

만약 소멸자를 empty하게가 아닌 명시적으로 정의 했을 때에는
C++의 제 3의 법칙을 어긴 것입니다.

제 3의 법칙이란 소멸자(Destructor), 복사 생성자 (Copy Constructor),
복사 할당 연산자 (Copy Assignment Operator) 중 하나를 명시적으로 만들었다면
나머지 모두 명시적으로 만들어야한다는 법칙입니다.

클래스가 메모리 동적 할당을 하는 경우, 소멸자에서 해당 메모리를 해제하게 되는데
복사 생성자로 생성된 클래스는 복사 원본과 동일한 자원을 가리키게 되고,
원본 클래스와 복사 클래스가 소멸자 호출 시,

동일한 자원에 대한 해제가 두번 발생하게 됩니다.
이를 Dangling Pointer 라고 부릅니다.

이는 이미 해제된 메모리를 다시 해제하게 되어 예외가 발생하고 프로세스가 종료하게 됩니다.

결론

이와같이 클래스 자원을 관리하고 소멸자에서 해당 자원을 반환하는 경우에는
소멸자를 직접 작성하게 되는 데 이 때 복사 생성자와 복사 할당 연산자를 같이 작성해주어야합니다.

만약 클래스에서 복사 연산자를 명시적으로 작성하지 않으면,
컴파일러가 기본 복사 연산자를 제공하면서 얕은 복사(Shallow Copy)를 수행합니다.
얕은 복사는 간단한 데이터 타입의 멤버가 있는 경우 문제가 되지 않을 수 있지만
동적으로 할당된 메모리나 다른 자원을 관리하는 경우 문제가 발생할 수 있습니다.

얕은 복사를 수행하면서 발생할 수 있는 문제는 다음 글에 정리 하려고 합니다.

관련 커밋 :
https://github.com/hyeonwoody/Beyond/commit/1fc3f2a51846b01d4ddfc5865c6910c7f7f3cf43

profile
예술융합형 개발자🎥

0개의 댓글