가상 소멸자
선행
* 동적 바인딩, 정적 바인딩에 대한 개념이 필요하다.
[C++] 동적 바인딩, 정적 바인딩
동적 정적 바인딩 사전 준비 * 먼저 다형성에 대한 개념을 알고 있어야 한다. https://licktwice.tistory.com/59https://licktwice.tistory.com/59 [JAVA]자바 - 다형성 Polymorphism 다형성 Polymorphism OOP의..
licktwice.tistory.com
소멸자도 함수
* 소멸자도 내부적으로는 함수와 같다.
소멸자도 기본이 정적 바인딩이며, 이는 문제가 생길 수 있다.
정적 바인딩 소멸자
* 소멸자가 정적 바인딩인 상황에서
부모 포인터형으로 소멸자를 호출 시 자식 소멸자가 호출되지 않는다.
* 이는 메모리 누수가 나올 수 있는 큰 문제이다.
* 해결법은 소멸자를 동적 바인딩을 하면 된다.
동적 바인딩 소멸자
* 소멸자 앞에 virtual만 붙이면 된다.
virtual은 상속되기 때문에 부모가 가상 소멸자이면
자식들은 알아서 가상 소멸자이다.
* 소멸자가 동적 바인딩이어야
언제나 자식 소멸자가 호출되고
자식 소멸자가 부모 소멸자를 호출한다.
코드
// 정적 바인딩 소멸자
class Animal {
public:
int mAge;
Animal(int age) : mAge(age) {}
~Animal() { cout << "부모 소멸자" << endl; }
};
class Dog :public Animal {
public:
string mName;
Dog(int age, string name) : Animal(age), mName(name) {}
~Dog() { cout << "자식 소멸자" << endl; }
};
int main() {
Dog* dog = new Dog(10, "까망이");
Animal* animal = dog;
delete animal;
return 0;
}
* 정적 바인딩 소멸자
부모 포인터형으로 delete를 하여, 부모 소멸자만 호출되었다.
// 동적 바인딩 소멸자
class Animal {
public:
int mAge;
Animal(int age) : mAge(age) {}
virtual ~Animal() { cout << "부모 소멸자" << endl; }
};
class Dog :public Animal {
public:
string mName;
Dog(int age, string name) : Animal(age), mName(name) {}
~Dog() { cout << "자식 소멸자" << endl; }
};
int main() {
Dog* dog = new Dog(10, "까망이");
Animal* animal = dog;
delete animal;
return 0;
}
* 동적 바인딩 소멸자
부모 포인터형으로 delete를 해도,
자식 소멸자, 부모 소멸자 모두 호출된다.
언제 사용하나
* 모든 클래스에 소멸자를 가상으로 만들 것을 추천한다.
* 가상 소멸자가 성능 상 느릴 수 있지만
메모리 누수는 너무 큰 문제이고,
누군가 클래스를 상속받는 것을 막지 못하기 때문이다.
* 즉, 클래스를 상속하지 못하게 막을 것이 아니라면
가상 소멸자로 하는 것을 추천한다.
귀여운 그림은 쭐어님이 그리셨습니다.
'C++' 카테고리의 다른 글
[C++] 유니크 포인터 unique_ptr (0) | 2022.07.10 |
---|---|
[C++] 참조 Reference (8) | 2022.07.04 |
[C++] 동적 바인딩, 정적 바인딩 (1) | 2022.06.30 |
[C++] friend 키워드 (2) | 2022.06.23 |
[C++] 객체 배열 생성 및 소멸 (Java와 다른점) (0) | 2022.06.22 |