함수내에서 에러발생 후 리턴처리

atomaths의 이미지

int my_func()
{
    <span>①동적 메모리 할당;</span>
 
    어떤 일 수행...;
 
    if (에러발생) {
        ①메모리 free;
        return -1;
    }
 
    <span>②DB 접속 등 추가적인 메모리 할당;</span>
 
    if (또다른 에러발생) {
        ①메모리 free;
        ②메모리 free
        return -2;
    }
 
    ①② 메모리 모두 free;
 
    return 0;
}

보통 위와 같은 경우에서 각각의 에러에 따른 메모리 해제를 어떤식으로 하는 것이 좋을까요?
대체적으로 많이 사용하시는 방법을 알고 싶습니다.
저런 방식이 아니라면 goto를 통한 처리를 해도 소스는 깔끔할 것 같은데, 왠지 goto는 좀 꺼려지네요.
아니면 무서운 setjmp, longjmp를 사용해야 하는 것인지...

어떻게들 처리하시는지 궁금합니다.

Fe.head의 이미지

C++이면 shared_ptr 같은거 쓰면 좋을테구

C언어인경우 저는 아래와 비슷한 소스를 썼습니다.

int my_func()
{
    char *  p1 = 0;
    char *  p2 = 0;
 
    p1 = (char *)malloc(100);
 
    ...
    if( err )
        goto err_return;
 
    p2 = (char *) malloc(200);
 
    ...
    if( err)
        goto err_return1;
 
 
    free( p1 );
    free( p2 );
 
    return 0;
 
err_return1:
    if( p2 != 0 ) free( p2 );
err_return:
    if( p1 != 0 ) free( p1 );
 
    return -1;
}

요즘 컴파일러들은 함수마다 라벨을 따로 따로 인식하는 것 같습니다.

-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

rapzzard의 이미지

원래 goto가 함수 통용 범위인지라 그렇게 사용할 수 있습니다.
이전의 베이직류와는 다릅니다;;

goto라고 해서 피할 필요는 없다고 봅니다.