2012-07-26 2 views
0

나는이 공유 라이브러리를 가지고 : MYLIB 및 loglib가 (이름 변경). 둘 다 소멸자 함수 (gcc의 확장자)가 있습니다. MYLIB 소멸자 함수 loglib의 기능을 요구한다. 이 방법 : libmy.so에서다른 라이브러리의 소멸자보다 먼저 소멸자가 호출되도록하려면 어떻게해야합니까?

mylib.c : liblog.so에서

void __attribute__ ((destructor)) mylib_destructor() 
{ 
    loglib_write_log("destructor"); 
} 

loglib.c : 당신이 볼 수 있듯이

void loglib_write_log(const char* txt) 
{ 
    fprintf(log_file, "%s\n", txt); 
} 

void __attribute__ ((destructor)) loglib_destructor() 
{ 
    if(log_file) 
    { 
     fclose(log_file); 
     log_file = NULL; 
    } 
} 

는 문제가 loglib_destructor()mylib_destructor() 전에 호출되는 경우 발생 : fprintf는 NULL 포인터 매개 변수를 가져옵니다.

나는 loglib.c을 변경할 수 없습니다.

내가 mylib_destructor 다른 도서관의 소멸자 전에 호출되는 것을 보장 할 수 있는가?

mylib 사용자가 자신의 소멸자에 대해 더 높은 우선 순위를 사용할 수 있기 때문에 mylib_destructor에 우선 순위를 우선 설정하고 싶지 않습니다. gcc 문서에서

답변

1

: 당신은 생성자와 소멸자 기능이 실행되는 순서를 제어하는 ​​옵션 정수 우선 순위를 제공 할 수

. 우선 순위 번호가 작은 생성자가 우선 순위 번호가 큰 생성자보다 먼저 실행됩니다. 반대의 관계는 소멸자에게 적용됩니다. 당신은 자원을 할당하는 생성자와 같은 자원의 할당을 해제 소멸자가 경우에 따라서, 두 기능은 일반적으로 동일한 우선 순위가 있습니다. 생성자와 소멸자 함수의 우선 순위는 namespace-scope C++ 객체에 지정된 우선 순위와 동일합니다 (C++ Attributes 참조).

당신이 시도 했습니까?

mylib의 우선 순위가 아니어도됩니다. 문서화되어 있다면 라이브러리 사용자가 신뢰할 수 있습니다.

관련 문제