C++에서 virtual destructor의 필요성은?
_____A1: virtual destructor는 기본 클래스에서 소멸자를 `virtual` 키워드로 선언한 것을 의미합니다. 이렇게 하면 파생 클래스 객체를 기본 클래스 포인터로 삭제할 때 올바른 소멸자가 호출됩니다.
Q2: virtual destructor가 왜 필요한가요?
A2: 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제할 때, 기본 클래스 소멸자가 비가상(non-virtual)이라면 파생 클래스 소멸자가 호출되지 않아 리소스 누수나 정의되지 않은 동작이 발생할 수 있습니다. virtual destructor를 선언하면 파생 클래스 소멸자까지 안전하게 호출됩니다.
Q3: virtual destructor가 없는 경우 어떤 문제가 발생하나요?
A3: 예를 들어:
```cpp
class Base {
public:
~Base() { std::cout << "Base destructor\n"; }
};
class Derived : public Base {
public:
~Derived() { std::cout << "Derived destructor\n"; }
};
Base* ptr = new Derived();
delete ptr;
```
이 경우 `Base` 소멸자만 호출되고 `Derived` 소멸자는 호출되지 않으므로, `Derived`에서 할당한 리소스가 제대로 해제되지 않아 메모리 누수가 발생합니다.
Q4: 모든 클래스에 virtual destructor를 선언해야 하나요?
A4: 일반적으로 기본 클래스로 사용되는 클래스나 상속이 예상되는 클래스에서는 virtual destructor를 선언하는 것이 안전합니다. 그러나 상속이 없고 객체가 파생 클래스 포인터로 삭제되지 않는다면 virtual destructor가 불필요할 수 있습니다.
Q5: virtual destructor 선언 시 주의할 점은 무엇인가요?
A5: virtual destructor도 하나의 가상 함수이므로, 기본 클래스에 가상 함수가 하나라도 있다면 virtual destructor를 선언하는 것이 일관성을 유지하는 데 좋습니다. 또한 virtual destructor는 기본 클래스와 파생 클래스 모두에 선언할 필요는 없으며, 기본 클래스에만 선언해도 충분합니다.
Q6: virtual destructor를 선언하면 성능에 영향을 미치나요?
A6: virtual 함수 호출 오버헤드가 소멸자 호출 시 약간 발생하지만, 대부분의 경우 중요하지 않습니다. 안전성을 위해 성능 저하는 감수하는 것이 일반적입니다.
Q7: virtual destructor가 없으면 컴파일러가 자동으로 생성해 주지 않나요?
A7: 컴파일러는 가상 함수를 가진 클래스에는 virtual destructor를 자동으로 생성하지 않으며, 프로그래머가 직접 선언해야 합니다. 자동 생성되는 소멸자는 가상 함수가 아니므로 주의가 필요합니다.
결론:
상속 계층에서 기본 클래스 포인터로 파생 클래스 객체를 삭제할 계획이라면 반드시 기본 클래스 소멸자를 `virtual`로 선언해야 하며, 그렇지 않으면 리소스 누수 및 정의되지 않은 동작이 발생할 수 있습니다.
작성자:
정민서 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:32
조회수: 141 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 141 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.