-
-
-
-
-
8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자프로그래밍/Effective c++ 2016. 3. 10. 13:50
소멸자에서 예외를 던지는 경우, 프로그램이 정의되지 않은 동작을 보일수 있다. 소멸자에서 예외가 생기는 경우 핸들링 해줄 주체가 모호 해지므로, 소멸자 안에서 예외를 삼키던지 프로그램이 종료되어야한다. -->사실 왜 소멸자에 대해서만 말하는 지 잘 모르겠습니다;; 1. 프로그램을 바로 끝내는 경우 --> abort호출DBConn : : -DBConn (){ try { db . close() ; } catch ( ... ) { close 호출이 실패했다는 로그를 작성; std: : abort(); }}2. 예외를 삼켜버리는 경우DBConn : : -DBConn (){ try { db . close() ; } catch ( ... ) { close 호출이 실패했다는 로그를 작성; }} 하지만 둘다 문제가 있..
-
7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 소멸자로 선언하자.프로그래밍/Effective c++ 2016. 3. 10. 13:50
1. 다형성 구조에는 가상소멸자를 쓰자. A클래스 를 상속하는 B클래스의 객체를 A포인터로 받아 이 포인터를 delete하면,A클래스의 소멸자가 불린 다음, A클래스의 소멸자가 virtual인 경우에 한해 B클래스의 소멸자도 불리게 된다.따라서 A클래스의 소멸자가 비가상함수인경우 B의 객체를 A의 포인터로 delete할때 A만 소멸하고, B는 소멸하지 않는 "부분 소멸 상태"가 되어 메모리가 불어나기시작한다... --> 다형성을 가진 기본 클래스의 경우 반드시 소멸자를 virtual로! 반면 상속시키지 않을 클래스인 경우(virtual 함수가 없는 경우)는 가상소멸자를 쓰는 것은 좋지 않다.가상 소멸자 때문에 가상함수 테이블이 만들어져 클래스가 가상함수테이블 포인터를 가지게 되어 포인터 크기만큼 클래스 ..
-
6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해버리자.프로그래밍/Effective c++ 2016. 3. 10. 13:50
어떤 함수가 실행되지 않게 하려면 선언하지 않으면된다.하지만 복사생성자와 복사 대입 연산자는 컴파일러가 자동 생성해주므로 이 방법이 통하지 않는다.따라서 private로 선언해버리면 되는데, 이때 friend 선언된 함수까지도 사용하지 못하게 하려면,private로 선언해두고, 정의하지 않는 법이 있다. 이때, 정의하지 않는 경우는 링커 에러가 생기게 되는데 이를 컴파일 타임 에러로 바꾸는 방법은,별도의 기본클래스에 사용하지 못하게 할 함수를 pivate로 넣어두고 상속받으면 된다. 이런 클래스의 파생클래스는 소멸자를 가상함수로 만들지 않아도 된다. --> 왜요...? 멤버변수가 없기 때문에..?
-
5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자프로그래밍/Effective c++ 2016. 3. 10. 13:49
선언하지 않아도 컴파일러가 자동으로 만들어주는 함수가 있다.바로 복사 생성자(copy constructor), 복사 대입 연산자(copy assignment operator), 그리고 소멸자(destructor)이다.이때 만들어주는 형태는 모두 기본형이며 public멤버이고 inline함수이다. 기본 생성 자와 소멸자의 역할컴파일러에게 "배후의 코드"를 깔 수 있는 자리를 마련.기본 클래스 및 비정적 데이터의 생성자와 소멸자를 호출하는 코드를 생성이때 소멸자는 이 클래가 상속한 기본 클래스의 소멸자가 가상 소멸자로 되어 있지 않으면 역시 비가상 소멸자로 만들어진다. 기본 복사생성자와 복사 대입 연산자의 역할원본 객체의 비정적 데이터의 사본을 객체 쪽으로 그냥 복사. 따라서 비정적 멤버변수가 참조자 또는 ..