일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 오블완
- UE4
- reference
- 비교 함수 객체
- implicit conversion
- 티스토리챌린지
- 언리얼
- 게임
- virtual function
- 스마트 포인터
- operator new
- c++
- 루아
- 상속
- lua
- Effective c++
- 함수 객체
- 참조자
- 암시적 변환
- resource management class
- 영화 리뷰
- 예외
- more effective c++
- Smart Pointer
- 메타테이블
- effective stl
- 반복자
- Today
- Total
목록2024/08 (22)
스토리텔링 개발자
항목 14. 예외 지정(exception specification) 기능은 냉철하게 사용하자 예외 지정(exception specification)함수를 선언할 때 함수가 발생시킬 예외를 미리 지정하는 기능장점어떤 함수가 어떤 예외를 발생시키는지가 드러나기에 코드 가독성이 좋아진다.예외 지정에 일관성이 없으면 컴파일러가 컴파일 중 발견해준다.함수가 예외 지정 리스트에 없는 예외를 발생시킬 경우런타임 에러가 발생하면서 unexpected라는 특수 함수가 자동으로 호출된다.단점unexpected 함수의 기본 동작은 std::terminate를 호출하는 것이다.terminate는 기본적으로 abort를 호출하는데, 이는 프로그램을 바로 멈춰버린다.활성 스택 프레임에 만들어진 지역 변수는 소멸되지 않는다.컴..
항목 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..
항목 9 : 리소스 누수를 피하는 방법의 정공은 소멸자이다. 지역 리소스에 대한 포인터지역 리소스(스택에서 생긴 리소스)를 조작할 때, 포인터는 부적절할 수 있다.소멸자가 불리지 않는 상황이 발생할 수 있기 때문이다.즉, 리소스 누수가 발생할 수 있다는 뜻이다.class ALA{public: virtual void processAdoption() = 0; ...};class Puppy : public ALA{public: virtual void processAdoption(); ...};class Kitten : public ALA{public: virtual void processAdoption(); ...};// s로부터 동물 정보를 읽어서// 적절한 타입의 객체를..
항목 8 : new와 delete의 의미를 정확히 구분하고 이해하자 ‘new 연산자’와 ‘operator new’의 차이string* ps = new string("Memory Management"); // new 연산자가 사용되었다.new 연산자C++에서 기본으로 제공한다.sizeof가 그런 것처럼, 동작 원리를 바꾸는 것이 불가능하다.동작 단계요청 타입의 객체를 담을 수 있는 크기의 메모리를 할당한다.(이 동작이 operator new 함수 호출로 동작된다.)객체의 생성자를 호출하여 할당된 메모리의 객체 초기화를 수행한다.operator new객체로 담을 메모리를 할당하는 방법이다.new 연산자는 필수적인 메모리 할당을 위해 operator new를 호출하게 되어 있다. operator new..
항목 7 : &&, ||, 혹은 , 연산자는 오버로딩 대상이 절대로 아니다 단축 평가(short-circuit)C와 마찬가지로 C++ 역시 복합적인 불린 표현식을 평가할 때 단축 평가 처리를 할 수 있다.즉, 표현식의 일부가 참, 거짓임이 판명되면, 그 이후의 표현식은 무시하고 평가를 중단한다.// 1.char* p;// 이 경우, p != 0 이 거짓으로 판명되면 strlen이 호출될 걱정을 할 필요가 없다.// 즉, null 포인터에 대한 strlen 호출이 되지 않음을 가정하고 작성한 코드이다.// null 포인터에 대한 strlen 호출은 미정의 사항이기 때문이다.if((p != 0) && (strlen(p) > 10)){ ... }// 2.int rangeCheck(int index){ ..