问题描述
这是我第一次问堆栈溢出问题,如果我做错了什么,请随时指出。非常感谢!
在结构中,只有一个类型为sem_t的变量 sem 。
struct myStruct
{
sem_t sem;
}myStruct;
在结构的初始化代码中,我这样写:
myStruct* init_myStruct()
{
myStruct* tmp = (myStruct*)malloc(sizeof(myStruct));
sem_init(&tmp->sem,1);
return tmp;
}
我的问题是:
-
init_myStruct()
是否正确实施?这会导致futex错误吗?是否需要将信号量 sem 声明为静态变量? - 第二个问题来自here。假设我们在 main 中调用
init_myStruct()
,那么在释放结构之前,我们需要释放信号量 sem 。假设将myStruct的指针分配给main中的 s ,那么仅执行free(&s->sem)
然后我们可以free(s)
是否正确?预先感谢。
解决方法
-
信号量可以在内存中的任何位置。只要在释放内存之前销毁信号量,就可以将它存储在使用
malloc()
分配的内存中,如另一个问题的答案所述。 -
您只能释放从
malloc()
返回的指针。由于分配了整个结构,因此还需要释放它。因此main()
应该做free(s)
。您无法执行free(&s->sem)
,因为&s->sem
不是malloc()
返回的指针。