2012-11-01 44 views
0

與C編程有關。如果我在malloc'd結構中聲明一個信號量,並且釋放()結構,我仍然需要銷燬信號量?

想我做到這一點:

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

對於任何非平凡的結構都有一個破壞函數通常是一個好主意。 –

+5

@亨利:內部結構是否包含指針並不重要,問題是信號量是一個資源,它的接口說它需要釋放。它可能只包含一個小整數(如文件描述符是一個小整數),操作系統使用該整數來標識該資源。它可能不包含對資源的任何類型的引用,但OS在某種結構中保存其地址,並在您銷燬時將其刪除。它可能沒有需要釋放的資源,而'sem_destroy'是一個無操作的,但是爲了允許它做某事的實現,你必須調用它。 –

相關問題