일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 문자열 조작
- leetcode 344
- 머신러닝
- 컴퓨터구조
- leetcode 49
- leetcode 15
- leetcode 238
- 스파크 완벽 가이드
- 빅데이터를 지탱하는 기술
- leetcode 121
- airflow docker
- leetcode
- Hortonworks Sandbox
- leetcode 561
- docker로 airflow 설치하기
- leetcode 234
- MapReduce 실습
- leetcode125
- Python
- 블로그 이전했어요
- webcrawler
- leetcode 937
- 데이터레이크와 데이터웨어하우스
- 올바른 변수명 짓기
- 배열
- leetcode 819
- Hadoop
- leetcode 5
- wargame.kr
- ctf-d
- Today
- Total
HyeM
More Effective C++[항목13] 본문
항목 13 : 발생한 예외는 참조자로 받아내자
catch문 작성시, 예외객체가 전달되는 방식
1 포인터 2 값 3 참조자에 의한 전달(예외받기)
TIP!
: 문제점
: 해결점
1. 포인터
예외를 포인터로 발생시, 객체의 복사 X
위의 코드는 완벽하지 않다.
프로그램 흐름이 떠나더라도, 예외 객체가 그대로 남아 있을 수 있는 방법이 필요하다.
이에 대한 대안은 힙 객체를 새로 만들고, 그 객체의 포인터를 예외로 발생시킨다.
이로써 위의 문제는 해결되지만, catch문으로 들어온 포인터를 삭제하느냐 마느냐의 문제가 생긴다.
만약 예외객체가 원래부터 힙에 할당되지 않은 것이면, 메모리 해제를 해선 안된다.
하지만 이를 알 수 있는 방법이 없으므로, 이런 경우는 피하는 것이 좋다.
또한 '포인터에 의한 예외잡기'는 c++에서 기본적으로 제공되는 표준 예외 4개인데, 이 표준예외는 객체에 대한 포인터가 아니라 모두 객체 이다. (따라서, 참조자나 값에 의한 예외받기를 통하지 않으면, 이 예외들을 쓸 수 없다.)
포인터 정리
문제1 . catch문으로 들어온 포인터를 삭제하느냐 마느냐의 문제
문제2 . C++표준예외를 사용할 수 없음.
2. 값에 의한 예외받기
값에 의한 예외받기는 '포인터에 의한 예외받기'와 달리,
예외를 삭제하느냐 마느냐의 고민도 없애주고, C++표준 예외하고도 잘 맞는다.
하지만, 예외 객체는 늘 두 번씩 복사 되고, 슬라이드 문제도 생긴다.
*슬라이드 문제 : 방생 시에는 파생 클래스의 객체였다가, 기본 클래스를 받는 catch문에 들어가면서 파생 클래스 부분에 추가되었던 데이터가 잘려나가는 현상.
▼예제보기
발생한 예외의 타입이 Validation_error이고 Validation_error에서 가상 함수 what을 재정의했다고 해도, 호출되는what은 Validation_error가 아니라 기본클래스의 것이다.
(슬라이스 문제)
값 정리
문제1 . 예외객체는 항상 두 번씩 복사됨
문제2 . 슬라이드 문제
3. 참조자에 의한 예외받기
포인터와 값에 의한 예외받기의 문제를 모두 겪지 않는다.
=> 참조자를 이용하면 문제를 생각하지 않아도 된다!!
▼예제보기
catch문에만 &를 추가하면 , 우리가 원하는 대로 동작한다.
재정의만 제대로 해두었으면 Validation_error의 what()이 호출된다.
'Programming > C++' 카테고리의 다른 글
More Effective C++[항목21-24] (0) | 2020.03.16 |
---|---|
More Effective C++[항목16-20] (0) | 2020.03.10 |
More Effective C++[항목14] (0) | 2020.02.26 |
More Effective C++ (0) | 2020.02.22 |
More Effective C++ (0) | 2020.02.20 |