일반적으로 c에서 goto 문은 쓰지 말라고, 혹은 절대로 쓰지 말라고 적혀 있는 책들이 많이 있다. 나도 처음에 c를 공부할 때는 goto 문은 절대로 쓰지 말아야 겠다는 강박 관념 비슷한게 있었다. 하지만 고수들(진짜로 프로그래밍을 잘한다고 인정할 만한 사람들)은 그런 제약을 신경쓰지 않는것 같다. 그 예로 goto 문의 활용만 봐도 정말로 코드가 이해하기 쉽고 잘 짜여지게 만들 수 있다는 점이다. 이런 걸 볼려면 잘 짜여진 많은 코드를 보면서 몸으로 느끼는 수 밖에...

아래 코드는 함수 f에서 메모리를 동적으로 할당 하였다가 문제가 생겼을때 동적 할당을 해제하는 것이다.
[code type=c]f(void)
{
  int *a, *b, *c;

  if ( ( a = malloc(100) ) == NULL )
  {
     return -1;
  }

  if ( ( b = malloc(100) ) == NULL )
  {
     free(a);

     return -1;
  }

  if ( ( c = malloc(100) ) == NULL )
  {
     free(a);
     free(b);

     return -1;
  }

/////////////////////////

}[/code]

 
위와 같이 resource를 제대로 해제해줘야 한다. 일반적으로 프로그램이 종료되면 운영체제가 알아서 사용했던 resource를 해제할 수도 있지만, 아닐 수 있으므로 이런 경우를 예방하기 위해 위와 같이 최소한 해제를 해줘야 한다.

하지만 위와 같은 경우 코드의 유지 보수와 코드 사이즈가 커지므로 힘들다. resource 추가나 해지시 free문을 일일이 수정해줘야 하므로....

 

아래와 같이 goto 문을 잘 활용하면 코드 자체가 간단해 지고 유지 보수가 쉬워 진다.

리눅스 커널에서 주로 많이 사용하는 기법이다.

 

[code type=c]if f(void)
{

  int *a, *b, *c, *d;
  int ret = 0;

  if ( ( a = malloc(100) ) == NULL )
  {
    ret = -1;
    goto a_err;
  }
  if ( ( b = malloc(100) ) == NULL )
  {
    ret = -1;
    goto b_err;
  }
  if ( ( c = malloc(100) ) == NULL )
  {
    ret = -1;
    goto c_err;
  }
  if ( ( d = malloc(100) ) == NULL )
  {
    ret = -1;
    goto d_err;
  }

///////


   free(d);
d_err :
   free(c);
c_err :
   free(b);
b_err :
   free(a);
a_err :
   ;

   return ret;

}[/code]


네이버 원래 블로그 주소
http://blog.naver.com/asca99/80013207623



크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
TAG ,
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/response/117

댓글+트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/response/117

트랙백 주소 :: http://www.cipher.pe.kr/tt/cipher/trackback/117

트랙백 RSS :: http://www.cipher.pe.kr/tt/cipher/rss/trackback/117

트랙백 ATOM :: http://www.cipher.pe.kr/tt/cipher/atom/trackback/117

댓글을 달아 주세요

댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/117
댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/117
[로그인][오픈아이디란?]