2012-11-01 2 views
0

C 프로그래밍 관련.malloc'd 구조체에서 세마포어를 선언하고 free() 구조체를 세마포어를 파괴해야합니까?

가정하자 나는이 작업을 수행합니다

struct myStruct 
{ 
    pthread_mutex_t myMutex; 
    sem_t mySemaphore; 
}; 

`

그리고 난 적절한 크기의 malloc와 세마포어 초기화 :

myStruct *create_myStruct() 
{ 
    myStruct *temp; 

    temp = (myStruct *) malloc(sizeof(myStruct)); 
    sema_init(&sema, 0, 0); 
    pthread_mutex_init(&(temp->myMutex), NULL); 
    return temp; 
} 

내가 수동으로 바로 세마포어를 파괴하거나해야합니까를 무료 전화는 할 수 있을까요?

답변

4

당신은 뮤텍스 모두에게 세마포어를 파괴해야하고, 그게 당신이 메모리를 해제 전에 발생합니다. 그렇지 않으면 리소스 유출이 있으며 프로그램에 정의되지 않은 동작이 있습니다.

개체와 그 개체가 나타내는 상태 및 다른 개체가 저장되어있는 메모리를 정신적으로 구분해야합니다. 어느 쪽도 다른쪽에 대해 안다. 그리고 양쪽이 아니라 모두는 개인적으로 (그리고 역순으로) 세워지고 찢겨 질 필요가있다.

+0

감사합니다. 필자는 세마포어의 내부 구조가 포인터를 포함하고 있다고 생각합니다. – Henry

+0

보통 사소한 구조체에는 destroy 함수를 사용하는 것이 좋습니다. –

+5

@Henry : 내부 구조체에 포인터가 포함되어 있는지 여부는 중요하지 않지만 세마포어는 공개해야하는 인터페이스가있는 리소스라는 점에서 문제가됩니다. OS가 해당 자원을 식별하는 데 사용하는 작은 정수 (파일 설명자와 같은 작은 정수)를 포함 할 수 있습니다. 리소스에 대한 어떤 종류의 참조도 포함하지 않을 수도 있지만 OS는 일부 구조에서 주소를 보유하고 파기 할 때이를 제거합니다. free가 필요한 리소스가 없을 수도 있고,'sem_destroy'는 no-op이지만 뭔가를하는 구현을 허용하기 위해서는 호출해야합니다. –

관련 문제