읽은 책/Effective C++
5. 소멸자
Lemonyun
2022. 4. 27. 15:40
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// C++ 스킬5: 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 | |
// 하위 클래스의 소멸자가 호출되지 않아 메모리 누수가 발생할 수 있기 때문에.. | |
// 가상 함수가 없는 경우에는 가상 소멸자를 사용하지 말자 | |
// 순수 가상 소멸자를 붙이면 추상 클래스가 된다. (자체적으로 인스턴스 생성을 막을 수 있다) | |
class AWOV { | |
public: | |
virtual ~AWOV() = 0; // 순수 가상 함수를 갖고 있으므로 AWOV은 추상 클래스 | |
}; | |
AWOV::~AWOV() {} | |
class BWOV : public AWOV { | |
}; | |
int main() { | |
// AWOV* a = new AWOV(); 추상 클래스는 자체적으로 인스턴스를 생성할 수 없다. | |
BWOV* b = new BWOV(); | |
delete b; | |
} | |
// C++ 스킬6: 소멸자에서 예외가 발생할 가능성을 최대한 낮추는 것이 좋다. | |
// 소멸자에서 예외가 일어날 수 있는 함수는 밖으로 빼서 다른 함수에 포함시켜 따로 진행하자 | |
// C++ 스킬7: 생성자와 소멸자에서는 가상 함수를 호출하지 말자. | |
// 가상 함수는 애초에 파생 클래스의 함수를 사용하기 위해 호출하는 것인데 생성자에서 호출한다는 것은 아직 만들어지지 않은 | |
// 파생 클래스 객체의 함수를 호출한다는 의미이므로 | |
C++ 스킬5: 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
어떤 클래스를 인스턴스를 만들지 못하는 클래스(추상 클래스)로 만들고 싶은데 마땅히 넣을 만한 순수 가상 함수가 없는 경우 순수 가상 소멸자를 선언하면 된다. (+ 소멸자의 정의도 필요하다)
기반 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다.
C++ 스킬6: 소멸자에서 예외가 발생할 가능성을 최대한 낮추는 것이 좋다.
ㄴ 소멸자 밖으로 예외가 빠져나가지 않도록 해야 한다.
C++ 스킬7: 생성자와 소멸자에서는 가상 함수를 호출하지 말자.