소멸자 4

[Effective C++] 항목 9: 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자

1. 개요저자는 객체 생성, 소멸중에 가상 함수를 절대 호출하지 말라고 합니다. 그 이유는 무엇일까? 지금부터 알아 보도록 합시다. 2. 문제아래 코드를 보면 Transaction이 가장 최상위 클래스이고 하위로 BuyTransaction, SellTransaction이 각각 Transaction을 상속받고 있는 상태입니다. main에서는 BuyTransaciton의 객체를 만들어 주고 있습니다. BuyTransaction객체를 만들기 위해서는 부모 클래스의 생성자가 먼저 호출되야 합니다. 그렇게 부모클래스인 Transaction의 생성자가 호출되는데 여기서 문제가 발생합니다. 왜냐하면 Transaction의 생성자에서는 logTransaction이라는 가상함수를 호출중이기 때문입니다. 여기서 호출되는..

[Effective C++] 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자

1. 여러개의 예외는 처리가 곤란하다.만약 이러한 클래스가 있고 벡터에서 10개의 Yeoul객체를 가지고 있다고 생각해보자.class Yeoul{public: ~Yeoul(){}};void DoSomething(){ std::vectorv;} 벡터 v가 소멸될때에 벡터는 자신이 들고있던 Yeoul객체들을 소멸시켜야 할 책임을 가지고 있습니다. 만약에 첫번째 Yeoul객체를 소멸하던중 예외가 생겼다고 생각해봅시다. 나머지 9개의 객체도 소멸되어야함으로 벡터는 여전히 나머지 객체에 대해서 소멸자를 호출하게 됩니다. 그런데 두번째 Yeoul객체 역시 예외를 발생시키면 어떻게 될까요? 이렇게 예외가 2개이상이 되어버리면 C++에서 감당하기 어렵습니다. 이러한 동작의 원인은 바로 예외가 터지는 것을 내..

[Effective C++] 항목 7: 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자

1. 부모 클래스 소멸자를 virtual로 해야하는 이유우리는 기본 클래스의 소멸자는 반드시 virtual로 선언해주어야 합니다. 아래 예시를 통해서 그 이유를 알아보도록 합시다.// Effective C++ 항목 7: 다형성을 위한 기초 클래스에서는 소멸자를 virtual로 선언하자#include class GameEntity {public: // 문제: 가상 소멸자가 없음 ~GameEntity() { std::cout createGameEntity()에서 반환되는 값들은 전부 heap에 있게 됨으로 결국엔 delete를 통해 메모리를 해제해 주어야 합니다. 그러나 이렇게 되면 PlayerCharacter의 소멸자는 호출되지 않게 됩니다. 그이유는 1. createGameEntity가 반환..

[Effective C++] 항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자

1. 컴파일러가 저절로 선언하는 함수들 컴파일러는 직접 선언하지 않으면 자동으로 선언해주는 함수들이 있습니다. 복사 생성자생성자복사 대입 연산자소멸자class Yeoul {private: int* data; public: // 생성자 Yeoul(int val) { data = new int(val); } // 복사 생성자 Yeoul(const Yeoul& rhs) { data = new int(*rhs.data); } // 복사 대입 연산자 Yeoul& operator=(const Yeoul& rhs) { if (this != &rhs) { delete data; data = new int(*rhs.data); } return *this; ..