2013-04-17 1 views
1

그래서이 상황이 있습니다. 종단 핸들러와 힙에 이전에 alloc'd 된 구조체에 대한 포인터.조건부 힙이 없습니다.

내가 원하는 것은 핸들러를 선택적으로 해제하는 것입니다. 각 포인터에 대해 대응 구조체가 alloc'd이면 자유 여야합니다. 나는 모든 포인터 상태 (alloc'd 또는 free)를 제어하고 핸들러가 해제해야하는지 결정하기 위해 정수 (1 포인터 -> 1 int)를 사용합니다.

여기에 코드

/*HEAP STATUS GLOBAL VARIABLES (1 => free required)*/ 
int free_addrinfo, free_up_rcvd, free_rc_rcvd, free_rc_rspn; 

/*HEAP POINTERS*/ 
struct addrinfo *result; 
USR_PSW *up_rcvd; 
TBOOK_RECORD *rc_rcvd, *rc_rspn; 

void termination_handler(){ 
    close(sock_ds); 
    close(acc_sock_ds); 
    if(free_addrinfo) freeaddrinfo(result); 
    if(free_up_rcvd) free(up_rcvd); 
    if(free_rc_rcvd) free(rc_rcvd); 
    if(free_rc_rspn) free(rc_rspn); 
    _exit(EXIT_SUCCESS); 
} 

는 똑똑한 솔루션이 있습니다입니까? 미리 감사드립니다.

답변

2

초기화시 변수를 NULL로 설정하고 해제 될 때 다시 NULL로 재설정합니다. 이미 자연적인 포인터가있을 때 포인터가 초기화된다는 별도의 표시기를 유지할 이유가 없습니다.

사실, 실제로 포인터를 해제해야 할 때가 전혀 없도록 코드를 작성하려고합니다. 그러나 불가능할 때 NULL 검사만으로 충분합니다.

+1

수동으로 설정해야합니까, 아니면 '무료'로 설정하면 포인터에 NULL이 설정됩니까? '{/*...*/ 무료 (usr_rec); usr_rec = NULL; /*...*/}' –

+0

그러나 termination_handler는 언제든지 시작할 수 있습니다. 나는 다른 방법으로 그것을 관리 할 수 ​​없다! –

+0

물론 'free'를 호출 한 후에 포인터를 NULL로 설정해야합니다. – Art

관련 문제