[C++ 문법] '소멸자 가상화'
MyData 클래스가 MyDataEx 클래스의 '기본 형식(부모 클래스)'이라면 MyData에 대한 포인터나 참조자로 MyDataEx 클래스 인스턴스를 참조할 수 있습니다.
MyData* pData = new MyDataEx;
참고로 위 코드처럼 '부모 클래스'로 '자식 클래스'를 참조할 때 '부모 클래스' 형식을 '추상 자료형'이라고 합니다. 그런데 이 '부모 클래스'를 이용해 동적 생성한 '자식 클래스'의 객체를 참조할 때 심각한 '메모리 누수(Memory Leak)' 문제가 발생할 수 있습니다.
// 부모 클래스 class MyData { private: char* m_pszData; public: MyData() { m_pszData = new char[32]; } ~MyData() { delete[] m_pszData; } }; // 자식 클래스 class MyDataEx : public MyData { private: int* m_pnData; public: MyDataEx() { m_pnData = new int; } ~MyDataEx() { delete m_pnData; } }; void main() { MyData* pData = new MyDataEx; delete pData; // '참조 형식'에 맞는 소멸자가 호출됩니다. }
위와 같이 코드를 작성하면 '참조 형식'의 소멸자만 호출됩니다. 반면, 소멸자 앞에 'virtual' 예약어를 붙여 '가상 함수'로 만든다면 '참조 형식'의 소멸자와 더불어 '실 형식'의 소멸자도 호출되어 안전하게 자원을 해제할 수 있게 됩니다.
'Programming > C C++' 카테고리의 다른 글
[C++ 문법] 'friend' 예약어 (0) | 2019.05.24 |
---|---|
[C++ 문법] '추상 클래스' (0) | 2019.05.24 |
[C++ 문법] '가상 함수(virtual function)' (0) | 2019.05.23 |
[C++ 문법] '연산자 함수(연산자 오버로딩)' (0) | 2019.05.23 |
[C++ 문법] '이동 생성자' (0) | 2019.05.22 |
댓글
이 글 공유하기
다른 글
-
[C++ 문법] 'friend' 예약어
[C++ 문법] 'friend' 예약어
2019.05.24 -
[C++ 문법] '추상 클래스'
[C++ 문법] '추상 클래스'
2019.05.24 -
[C++ 문법] '가상 함수(virtual function)'
[C++ 문법] '가상 함수(virtual function)'
2019.05.23 -
[C++ 문법] '연산자 함수(연산자 오버로딩)'
[C++ 문법] '연산자 함수(연산자 오버로딩)'
2019.05.23
댓글을 사용할 수 없습니다.