2009-12-01 3 views
13

최근에 나는 오히려 유용하다고 gcc의 확장을 가로 질러왔다 . 예를 들어, 다음 코드 섹션이 주어지면 foo 호출 내 모든 경우에 모든 메모리가 명시 적으로 유지 관리되고 처리되어야합니다. 그러나휴대용 상당

void foo() { 
    char * buff = ...; /* some memory allocation */ 
    char * buff2 = 0, * buff3 = 0; 
    if (! buff) { 
     return; 
    } else { 
     buff2 = ...; /* memory allocation */ 
     if (! buff2) { 
     goto clean_exit; 
     } else { 
     /* ... and so on ... */ 
     } 
    } 

clean_exit: 
    free (buff); 
    free (buff2); 
    free (buff3); 
} 

확장 프로그램을 사용하여 그 이제 모든 메모리/다른 또는 고토 구성체가 통합 메모리와 결합하는 경우 중첩을 사용하지 않고 범위에 기초하여 회수

#define clean_pchar_scope __attribute__((cleanup(pchar_free))) 

void pchar_free (char ** c) { free (*c); } 

void foo() { 
    char * buff clean_pchar_scope = ...; /* some memory allocation */ 
    char * buff2 clean_pchar_scope = 0, * buff3 clean_pchar_scope = 0; 
    if (! buff) 
     return; 
    buff2 = ...; /* memory allocation */ 
    if (! buff2) 
     return; 
    /* and so on */ 
} 

을 줄일 수 함수의 릴리스 섹션. 나는 goto의 사용이 if/else 구조가 더 중첩되어 있기 때문에 피할 수 있다는 것을 알고 있습니다. (예, goto에 거룩한 전쟁은 없습니다 ...) 예가 고안되었지만 이것이 사실 일 수 있습니다. 매우 유용한 기능.

불행히도, 아는 한, 이것은 gcc에만 해당됩니다. 나는 같은 일을하는 어떤 포터블 방식에도 관심이있다 (존재한다면). 누구도 gcc 이외의 다른 작업을 해본 경험이 있습니까?

편집 : 이식성이 작동하지 않는 것으로 보입니다. 그것을 고려하여, 이것을 할 방법이 있습니까 gcc 공간 밖에 있습니까? 다행히이 소멸자와 C의 표준 기능 ++의

+0

다소 관련 : http://stackoverflow.com/questions/1602398/linux-dlopen-can-a-library-be-notified-when-it-is-loaded – jldupont

+0

다소 거친 것입니다. 내가 찾고 있어요. 두 경우 모두 그 해결책은 여전히 ​​gcc 특정 (수용된 대답의 경우)이거나 C++가 클래스 기반 응답과 관련이있는 것처럼 보입니다. – ezpz

답변

8

C.

에는 휴대용 방법은 없습니다 ... GCC-구체적으로 좋은 특징을 보인다.

편집 :

MSVC뿐만 아니라이 목적을 위해 사용할 수있는 __try와 __finally 키워드가 나타납니다. 이것은 C++ 예외 처리와는 다르며 이라고 생각합니다.

C + +의 암시 적 지원으로 인해 정리를 시도하고 마지막으로 널리 사용되지는 않습니다. "행동에 관심이있는 사람들이 자신의 코드를 C++로 쉽게 전환 할 수 있도록"충분히 가까이 다녀 왔습니다 ".

+0

그래, 이식성 문제를 무시하도록 업데이트했습니다. 그 밖에서 gcc 밖에서이 작업을 수행하는 방법을 알고 있습니까? – ezpz

-5

boost :: shared_ptr을 사용할 수 있습니다.

boost::shared_ptr<char> buffer(p, cleanup); 
+2

질문은 C 특정 적입니다. 나는'auto_ptr'과'boost ::'기능을 이해하지만, 불행하게도 그들은 C에 적용되지 않는다. – ezpz

-2
void foo() 
{ 
     char *buf1 = 0, *buf2 = 0, *buf3 = 0; 
     /** more resource handle */ 

     do { 

       if (buf1 = ... , !buf1) break; 
       if (buf2 = ... , !buf2) break; 
       if (buf3 = ... , !buf3) break; 

       /** to acquire more resource */ 

       /** to do with resource */ 

     } while (0); 

     /** to release more resource */ 

     if (buf3) free(buf3); 
     if (buf2) free(buf2); 
     if (buf1) free(buf1); 
} 
3

질문의 첫 번째 절반을 할 수있는 휴대용 방법입니다.