8항목 9항목 10학목까지 오면서 익혔던 개념들에 대하여, 정리를 해 보는 코너이다. 1. 중요한 예외 안전에 관한 보증은 무엇인가? 2. 막 구현한 Stack에서, 포함하는 T의 필수사항은 무엇인가? 답 1. 답이라고 할것 까진 없지만, 의미상 그렇다는 뜻이다. (Effective C++ 을 보게 되면, 정리된것이 나와 있으니 자세한것은 그것을 참고 하도록) 기본 보증 : 예외가 있어도 Stack 개체의 자원에 피해가 가지 않는다. 강한 보증 : 예외에 의해 연산이 중단되도, 프로그램 상태는 바뀌지 않는다. 완벽 보증 : 어떠한 상황에서도 예외를 발생시키지 않는다. 아무리 못해도 기본 보증은 있어야 된다고 본다. 2. T::T 기본 생성자 T::T(const T& rhs) 복사 생성자 T& T::ope..
예외 안전성 검색 결과
극강 난이도 9½ 이다. 기본 생성자와 소멸자, 복사 할당자와 복사 생성자를 만들었다면, 이제 스택의 인터페이스를 만들어야 된다. 지금까지 한것들을 간축하게 정리하게 되면 template class Stack { public: Stack(); ~Stack(); Stack( const Stack& ); // 복사 생성자 Stack& operator=( const Stack& ); // 복사 할당자 private: T* v_; // T의 vsize_를 위해 size_t vsize_; // 충분히 큰 메모리를 가리키는 size_t vused_; // 포인터 T의 실제 사용 개수 }; 문제 : Count(), Push(), 그리고 Pop()를 예외에 안전하도록 작성해 보도록 하자. Count( ) templat..
다시 Stack 템플릿 클래스를 가져 온다. template class Stack { public: Stack(); ~Stack(); Stack( const Stack&); // 복사 생성자 Stack& operator=(const Stack&);// 복사 할당자 /* .... */ private: T* v_; // T의 'vsize_'를 위해 충분히 size_t vsize_; // 큰 메모리를 가리키는 포인터 size_t vused_; // T의 실제 사용 개수 }; 문제 : 이제 예외에 안전한 복사 생성자와 복사 할당자를 만들어 보아라. 곰곰히 생각해 보면 복사 생성자와 복사 할당자는 서로 같은 로직이 들어 갈 수 밖에 없을 것이다.( 왜냐하면, 복사된다는 전제가 똑같이 깔리기 때문이다,) 그래서 복..
예외 처리와 템플릿은 C++의 가장 강력한 기능이다. 하지만 템플릿의 어떤 함수가 예외를 일으킬지 모르는 상태에서, 예외에 안전한 코드를 작성하기 어렵다. 이번 항목은 예외처리와 템플릿이라는 두 가지 주요 기능을 어떻게 하면 예외에 안전하고, 예외에 중립적인 일반 컨테이너를 작성하면서 배우게 해준다. 자 그럼 컨테이너의 기초격인 Statck 을 예외에 안전하고 중립적으로 만드는지 배워보도록 하자. template class Stack { public: Stack(); ~Stack(); /* .... */ private: T* v_; // T의 'vsize_'를 위해 충분히 size_t vsize_; // 큰 메모리를 가리키는 포인터 size_t vused_; // T의 실제 사용 개수 }; 문제 : 어떻..
예외 안전성이란 무슨 말인가? "예외적 상황에 대해서 안전한가?"에 대한 말이다. 왜 확보해야 하는가? .. 코딩중에 컴파일타임에 에러를 다 찾아내면 좋겠지만, 컴파일 타임에 찾지 못하는 에러들은 정말 찾기가 힘들어진다. 그렇기 때문에, 예외적 상황에 대해서 대처를 해야지만 디버깅이 용이해지고, 프로그램 자체도 더 견고해지기 때문에 확보해야 한다. 함수들의 예외 안전성은 어떻게 동작해야 하는가? 1. 자원이 절대 새도록 만들지 않는다. 2. 자료구조가 더렵혀지는 것을 허용하지 않는다.(.. 이 말은 자료가 자료가 아닌게 되는 상황을 말한다.) 그렇다면, 예외 안전성을 갖춘 표준 보장은 무엇인가? 1. 기본적인 보장(basic guarantee) : 예외 발생에 있어, 자원 누수를 시키지 않겠다는 보장 2..
최근댓글