2012-11-01 12 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'是一个无操作的,但是为了允许它做某事的实现,你必须调用它。 –

相关问题