Skip to content

2014 06 13 virtual 소멸자

krikit edited this page Nov 26, 2014 · 1 revision

virtual 소멸자

소멸자의 경우 그냥 무조건 virtual로 선언하는 것이 안전합니다. 아래 코드를 보시죠.

class Parent {
 public:
  Parent() : prt_mem(new int) {}
  ~Parent() {
    if (prt_mem != std::nullptr) delete prt_mem;
  }
 private:
  int* prt_mem;
};

class Child : public Parent {
 public:
  Child() : chd_mem(new int) {}
  ~Child() {
    if (chd_mem != std::nullptr) delete chd_mem;
  }
 private:
  int* chd_mem;
};

int main(int argc, char** argv) {
  Parent* obj = new Child();
  delete obj;    // 메모리 누수!

  return 0;
}

Parent 포인터에 Child 객체를 동적 할당하고 추후에 그 객체를 소멸하고자 delete를 호출할 경우 virtual로 선언되지 않으면 C++는 정직하게 Parent 클래스의 소멸자만 호출하고 말게되어, Child 클래스에서 동적으로 할당한 메모리는 반환되지 않습니다.

Clone this wiki locally