지역 객체는 함수의 유효범위가 끝나면 자동으로 소멸되기 때문에 지역 객체를 포인터로 전달하는 것은 소멸된 객체를 전달하는 위험이 있음

대안은 힙 객체를 전달

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();
    }
}

+ Recent posts

목차