C++/Class
2021. 3. 20. 17:45
가상 소멸자
- virtual 키워드를 소멸자에도 붙일 수 있다.
예제
가상 소멸자를 사용하지 않은 기본 예제
#include <iostream> class Base { public: ~Base() { std::cout << "~Base()" << std::endl; } }; class Derived : public Base { int *array_; public: Derived(const int& length) { array_ = new int[length]; } ~Derived() { std::cout << "~Derived()" << std::endl; delete[] array_; } }; int main() { using namespace std; Derived derived(5); } /* stdout ~Derived() ~Base() */
메모리 누수 예제
#include <iostream> class Base { public: ~Base() { std::cout << "~Base()" << std::endl; } }; class Derived : public Base { int *array_; public: Derived(const int& length) { array_ = new int[length]; } ~Derived() { std::cout << "~Derived()" << std::endl; delete[] array_; } }; int main() { using namespace std; Derived *derived = new Derived(5); Base* base = derived; delete base; } /* stdout ~Base() */
부모와 자식 클래스의 소멸자에
virtual
키워드를 붙이고, 자식 클래스의 소멸자에override
까지 붙여주면 좋다.#include <iostream> class Base { public: virtual ~Base() { std::cout << "~Base()" << std::endl; } }; class Derived : public Base { int *array_; public: Derived(const int& length) { array_ = new int[length]; } virtual ~Derived() override { std::cout << "~Derived()" << std::endl; delete[] array_; } }; int main() { using namespace std; Derived *derived = new Derived(5); Base* base = derived; delete base; } /* stdout ~Derived() ~Base() */
'C++ > Class' 카테고리의 다른 글
C++ 동적 바인딩 (Dynamic Binding) (0) | 2021.03.20 |
---|---|
C++ 정적 바인딩 (Static Binding) (0) | 2021.03.20 |
C++ 공변 반환형(Covariant Return Type) (0) | 2021.03.20 |
C++ Override, Final (0) | 2021.03.20 |
C++ 가상 함수와 다형성 (virtual) (0) | 2021.03.20 |