비 가상 소멸자
// Animal.hpp
class Animal
{
public:
~Animal();
private:
int mAge;
};
// Cat.hpp
class Cat : public Animal
{
public:
~Cat();
private:
char *mName;
};
Cat myCat = new Cat(2, "Coco");
delete myCat;
Animal yourCat = new Cat(4, "Mocha");
delete yourCat;
- 정적 바인딩의 경우 메모리 누수의 문제가 생긴다.
- 기본 클래스의 소멸자만 호출되므로 동적 할당된 메모리가 완전히 해제되지 않는다.
가상 소멸자
// Animal.hpp
class Animal
{
public:
virtual ~Animal();
private:
int mAge;
};
// Cat.hpp
class Cat : public Animal
{
public:
virtual ~Cat(); // 여기에서는 virtual을 생략할 수 있다.
private:
char *mName;
};
virtual
키워드가 붙어있으므로 자식 클래스의 가상 테이블로 연결된다.
가상 소멸자의 필요성
- 모든 클래스에 가상 소멸자를 만드는 것이 좋다.
- 가상 소멸자를 생성하면 성능이 낮아짐에도 왜 만들어야 하는가?
- 누군가가 내 클래스를 상속 받으려고 할 때 메모리 누수를 방지하기 위해 필요하다.
'Language > C++' 카테고리의 다른 글
[C++] 22.Unmanaged Programming: 추상 클래스 (0) | 2024.01.30 |
---|---|
[C++] 21.Unmanaged Programming: 다중 상속 (1) | 2024.01.30 |
[C++] 19.Unmanaged Programming: 다형성(Polymorphism) (0) | 2024.01.30 |
[C++] 18.Unmanaged Programming: 상속(Inheritance) (0) | 2024.01.30 |
[C++] 17.Unmanaged Programming: 연산자 오버로딩과 const (0) | 2024.01.30 |