1)
Animal 클래스와 Cat 클래스가 존재한다.
Cat 클래스를 Animal 클래스 포인터로 가리킨 상태에서 (Upcasting)
그대로 삭제하게 되면 ~Animal만 호출되고 ~Cat은 호출되지 않아
Cat의 내용물이 모두 해제되지 않는 메모리 릭이 발생할 수 있다.
2)
이를 해결하기 위해서는 Animal 클래스의 소멸자를 virtual로 선언해주면 된다.
3)
하지만 모든 클래스의 소멸자에 무조건 virtual을 붙여주는 것은 좋지 않다.
이유는 virtual을 붙이는 순간 해당 객체는 vtable을 가리키는 vptr을 내부적으로 가지게 되고,
이는 즉 다시 말해 객체의 크기가 커지는 것을 의미한다.
해당 객체의 개수와 빌드 아키텍처에 따라 고작 virtual 하나를 붙였을 뿐인데 불필요한 메모리 낭비가 많이 발생할 수 있으므로, virtual 소멸자는 해당 객체 내부에 다른 virtual 함수가 있을 때만 사용하자. (어차피 vptr만큼의 공간이 소비되므로)
정리하면,
부모로 사용되는 클래스이며, 내부에 virtual한 함수를 가지고 있는 클래스의 소멸자는
virtual로 선언해주어야 한다.
'lang > c++' 카테고리의 다른 글
템플릿 사용 시 LNK1120 "확인할 수 없는 외부 참조" 발생 (0) | 2023.08.24 |
---|---|
std::shared_ptr은 thread-safe한가? (0) | 2023.05.30 |
atan, atan2 (0) | 2022.07.05 |
std::iterator, std::advance (0) | 2022.05.18 |
Bitwise operator (C/C++) (0) | 2021.08.20 |