일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 상속
- 티스토리챌린지
- 영화 리뷰
- 암시적 변환
- 언리얼
- 비교 함수 객체
- exception
- 영화
- operator new
- more effective c++
- 오블완
- Effective c++
- 다형성
- resource management class
- Vector
- reference
- 루아
- Smart Pointer
- 반복자
- 참조자
- 스마트 포인터
- implicit conversion
- effective stl
- virtual function
- 예외
- 게임
- lua
- c++
- UE4
- 메타테이블
- Today
- Total
목록exception (8)
스토리텔링 개발자
항목 15. 예외 처리에 드는 비용에 대해 정확히 파악하자 객체 생성 성공 여부를 체크하는 자료구조가 소모하는 메모리(항목 10 참조)컴파일러에 따라선 예외 발생 여부를 꺼버릴 수도 있다.극단적인 비용 절감을 위해서는 고려해 볼 수도 있을 것이다.하지만 예외는 C++ 언어의 일부이므로 컴파일러가 이 비용을 완전히 없앨 수는 없다.프로그램은 여러 개의 독립적인 오브젝트(.obj) 파일로 만들어진다.하나의 오브젝트 파일이 예외를 사용하지 않는다고, 다른 오브젝트 파일도 그러리란 법은 없다.오브젝트 파일들이 모두 예외를 사용하지 않는다 쳐도, 링크되는 라이브러리에서 사용한다면?어느 한 부분이라도 예외를 사용하면, 프로그램 전체가 예외를 지원할 수밖에 없다.만약, 예외를 지원하지 않는 라이브러리를 만든다면예..
항목 13. 발생한 예외는 참조자로 받아내자 catch 매개변수를 포인터로(catch-by-pointer)이론 상으로는 포인터로 받는 것이 가장 효율적이어야 한다.(항목 15 참조)객체의 복사 없이도 전달이 이루어지기 때문이다.class exception { ... };void someFunction(){ static exception ex; // 범위를 벗어나도 살리기 위해 static 선언 // exception ex; // 이처럼 선언하기라도 하면 미정의 동작을 유발한다!! ... throw &ex; // 포인터 객체를 던진다. ...}void doSomething(){ try { someFunction(); } catch(except..
항목 12 : 예외 발생이 매개변수 전달 혹은 가상함수 호출과 어떻게 다른지를 이해해자. 함수 매개변수와 예외발생 구문class Widget { ... };// 함수 매개변수void f1(Widget w);void f2(Widget& w);void f3(const Widget& w);void f4(Widget* pw);void f5(const Widget* pw);// 예외처리 구문catch(Widget w) ...catch(Widget& w) ...catch(const Widget& w) ...catch(Widget* w) ...catch(const Widget* w) ...문법상으론 다른 점을 찾을 수 없다. 유사점전달 방식값, 참조, 포인터 전달이 모두 가능하다. 차이점 프로그램 흐름함수..
항목 11 : 소멸자에서는 예외가 탈출하지 못하게 하자 소멸자가 호출되는 상황객체가 통상적인 조건에서 소멸되었을 때지역변수 객체가 유효범위(scope)를 벗어날 때객체가 직접 삭제(delete)될 때예외 처리 매커니즘에 의해 객체가 소멸되었을 때예외 전파(exception propagation) 과정의 일부분으로 스택 되감기가 진행될 때즉, 소멸자가 호출되었을 때 예외가 발생된 상태인지 아닌지 알 방도가 없다.실은 이제는 std::uncaught_exception을 통해서 예외가 스택 되감기(unwinding) 중인지 알아낼 수 있다. 예외가 소멸자를 빠져나가면 안되는 이유 1소멸자 내부에서 예외 발생 상태인지 구별할 방법이 없다.어떤 상황이든 예외가 발생된 상태라고 가정하고 소멸자를 방어적으로 ..
항목 10. 생성자에서는 리소스 누수가 일어나지 않게 하자. 생성자 설계 예제// 이미지 정보 클래스class Image{public: Image(const string& imageDataFileName); ...};// 오디오 정보 클래스class AudioClip{public: AudioClip(const string& audioDataFileName); ...};// 전화번호 클래스class PhoneNumber { ... };// 주소록에 들어가는 하나의 정보에 대한 클래스class BookEntry{public: BookEntry(const string& name, const string& address = "", co..
항목 29 : 예외 안전성이 확보되는 그날을 위해 싸우고 또 싸우자! 예외 안정성을 고려하지 않은 코드class PrettyMenu{public: ... void changeBackground(istream& imgSrc); // 배경 그림을 바꾸는 함수 ...private: Mutex mutex; Image* bgImage; int imageChanges;};void PrettyMenu::changeBackground(istream& imgSrc){ lock(&mutex); delete bgImage; ++imageChanges; bgImage = new Image(imgSrc); unlock(&mutex);} 예외..
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 맞추자 매개변수 평가다음 코드는 자원을 흘릴 가능성이 있다.void processWidget(shared_ptr pw, int priority);...processWidget(shared_ptr(new Widget), priority());컴파일러는 호출 코드를 만들기 전, 매개변수로 넘겨지는 인자를 평가한다.두 번째 인자(priority 함수)는 호출문 뿐이다.첫 번째 인자(shared_ptr(new Widget)은 두 부분으로 나뉘어져 있다."new Widget" 표현식을 실행하는 부분shared_ptr 생성자를 호출하는 부분그러므로 컴파일러는 다음 세 가지 연산을 위한 코드를 생성한다.priority를 호출한..
항목 8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자. C++은 예외를 내보내는 소멸자를 좋아하지 않는다.'소멸자에서 예외 발생'은 미정의 사항이다.(컴파일러 구현에 따라 다르게 반응한다.)그러므로 소멸자에서는 예외를 던지지 않도록 처리해야 한다. 소멸자가 예외를 던지지 않게 하는 두 가지 방법예외 발생 시 프로그램을 종료시킨다에러 발생 후 프로그램 실행을 계속할 수 없는 상황이라면 이 선택지예외를 삼켜버린다발생한 예외를 무시해도 프로그램이 신뢰성 있게 실행 지속되어야 한다는 보장이 된다면 이 선택지catch에서 어떤 처리도 해주지 않음으로써 예외를 삼켜버릴 수 있다. 소멸자에서 예외 발생하는 부분을 “사용자가 제어할 수도 있게” 함수를 제공해준다.사용자에게 예외 처리를 처리할 수 있는 선택..