effective 3

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

다형성을 가진 기본 클래스에서는 반드시 가상 소멸자를 선언하자C++에서는 다형성을 가진 기본 클래스의 경우, 소멸자를 반드시 가상 소멸자로 선언해야 합니다. 그렇지 않으면, 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제할 때 파생 클래스의 소멸자가 호출되지 않아 메모리 누수나 불완전한 소멸 문제가 발생할 수 있습니다.기본 클래스의 비가상 소멸자를 사용할 경우, C++ 표준에 따르면 기본 클래스 포인터를 통해 파생 클래스 객체를 삭제하는 것은 미정의 동작이 됩니다.예제 1: 비가상 소멸자의 문제점class TimeKeeper{public: TimeKeeper(); ~TimeKeeper(); // 비가상 소멸자};int main(){ TimeKeeper* ptk = getTimeKeep..

항목 6] 컴파일러가 자동으로 생성하는 함수를 불필요할 때 명시적으로 금지하자

컴파일러가 자동으로 생성하는 함수를 불필요할 때 명시적으로 금지하자클래스를 사용할 때, 때로는 복사 생성자와 복사 대입 연산자의 사용을 금지하고 싶을 때가 있습니다. 그렇다고 해서 우리가 이를 구현하지 않았다고 해서 자동으로 금지되는 것이 아니라, 컴파일러가 자동으로 생성해버립니다. 이를 방지하는 방법은 명확히 복사 생성자와 복사 대입 연산자의 사용을 금지하는 것입니다.문제 상황class CA{ // 아무 것도 구현하지 않음};int main(){ CA ca; CA ca2; CA ca3(ca); // 복사 생성자 호출 ca2 = ca; // 복사 대입 연산자 호출}위의 예제에서 CA 클래스는 복사 생성자와 복사 대입 연산자가 명시적으로 정의되지 않았습니다. 그럼에도 불구하고..

항목 5] C++이 자동으로 생성하고 호출하는 함수들에 주의하자

C++이 자동으로 생성하고 호출하는 함수들에 주의하자class Empty { };class Empty {public: Empty() { /* ... */ } // 기본 생성자 Empty(const Empty& rhs) { /* ... */ } // 복사 생성자 ~Empty() { /* ... */ } // 소멸자 Empty& operator=(const Empty& rhs) { /* ... */ } // 복사 대입 연산자};C++에서는 프로그래머가 명시적으로 선언하지 않아도 컴파일러가 자동으로 생성해주는 멤버 함수들이 있..

반응형