지역 객체는 함수의 유효범위가 끝나면 자동으로 소멸되기 때문에 지역 객체를 포인터로 전달하는 것은 소멸된 객체를 전달하는 위험이 있음
대안은 힙 객체를 전달
void someFuntion()
{
exception ex;
throw &ex;
}
// 힙 객체 전달
void someFuntion()
{
throw make_unique();
}
C++에서 기본적으로 제공되는 표준 예외는 bad_alloc(메모리 할당을 실패했을 때), bad_cast(dynamic_cast가 실패했을 때), bad_typeid(dynamic_cast를 nullptr에 적용했을 때), bad_exception(바라지 않은 예외가 발생했을 때)인데, 이 표준 예외는 객체에 대한 포인터가 아니라 모두 객체
따라서 참조자나 값에 의한 전달을 사용하지 않으면 위 예외들을 사용할 수 없음
값에 의한 전달은 객체가 두 번씩 복사되고, 슬라이스 문제가 있는 단점이 있음
참조자에 의한 전달은 포인터에 의한 전달과 달리 C++ 표준 예외를 처리할 수 있고, 값에 의한 전달과 달리 슬라이스 문제가 없고 한 번만 복사됨
class exception {};
class Validation_error : public exception {};
void someFuntion()
{
throw Validation_error();
}
void doSomething()
{
try
{
someFuntion();
}
catch ( exception& ex)
{
cerr << ex.what();
}
}
'C++ > More Effective C++' 카테고리의 다른 글
[More Effective C++] 항목 18 예상되는 계산 결과를 미리 준비하면 처리비용을 깎을 수 있다 (0) | 2025.03.05 |
---|---|
[More Effective C++] 항목 16 뼛속까지 잊지 말자, 80-20 법칙! (0) | 2025.03.01 |
[More Effective C++] 항목 12 예외 발생이 매개변수 전달 혹은 가상 함수 호출과 어떻게 다른지 이해하자 (0) | 2025.02.23 |
[More Effective C++] 항목 11 소멸자에서는 예외가 탈출하지 못하게 하자 (0) | 2025.02.21 |
[More Effective C++] 항목 10 생성자에서는 리소스 누수가 일어나지 않게 하자 (0) | 2025.02.20 |