我有一个结构,你可以在下面看到:
typedef struct _List {
Person *person; // pointer for people list
DoList *do; // Kinda timer, for checking list in some intervals
} List;
是否需要释放此结构?如果是这样,我怎么能释放它?
答案 0 :(得分:13)
如果动态分配结构,则必须释放结构。如果您动态分配了成员并且在其他地方没有对它们的引用,则必须在释放结构之前释放其成员。
以下是一些例子:
void freeNotRequiredHere() {
List nonDynamicList;
Person nonDynamicPerson;
DoList nonDynamicDoList;
nonDynamicList.person = &nonDynamicPerson;
nonDynamicList.do = &nonDynamicDoList;
}
void freeRequiredForStructListOnly() {
List *dynamicList;
Person nonDynamicPerson;
DoList nonDynamicDoList;
dynamicList = (List *) malloc( sizeof(struct List) );
dynamicList->person = &nonDynamicPerson;
dynamicList->do = &nonDynamicDoList;
free( dynamicList );
}
void freeRequiredForStructListAndPersonOnly() {
List *dynamicList;
Person *dynamicPerson;
DoList nonDynamicDoList;
dynamicList = (List *) malloc( sizeof(struct List) );
dynamicPerson = (Person *) malloc( sizeof(Person) );
dynamicList->person = dynamicPerson;
dynamicList->do = &nonDynamicDoList;
free( dynamicPerson );
free( dynamicList );
}
void freeRequiredForStructListAndPersonOnly( DoList *notSureDoList ) {
List *dynamicList;
Person *dynamicPerson;
dynamicList = (List *) malloc( sizeof(struct List) );
dynamicPerson = (Person *) malloc( sizeof(Person) );
dynamicList->person = dynamicPerson;
dynamicList->do = notSureDoList;
// maybe notSureDoList was allocated with malloc(),
// maybe it is a non-dynamic stack variable.
// the calling function should deal with free()'ing notSureDoList
free( dynamicPerson );
free( dynamicList );
}
答案 1 :(得分:4)
如果您使用malloc()
分配了一个对象,那么您需要在某个时候free()
。
答案 2 :(得分:4)
void free_mystruct(struct_List *a_ptr){
free(a_ptr->person);
free(a_ptr->do);
free(a_ptr);
}
如果您使用malloc初始分配内存。
答案 3 :(得分:4)
所以你问“......是否需要免费......?”,答案是“它取决于。”
如果几乎需要结构,直到程序通过main(),
exit()
或信号返回终止,那么 否 不管它是什么,都不应该被释放。 1
如果资源是在一个长期存在的进程(如编辑器或服务器守护程序)中动态分配的,但如果在事务或一段时间后不再需要它,则 是< / em> ,它确实需要被释放,否则程序会有内存泄漏。
如果包含的对象也是动态分配的,则释放结构将产生内存泄漏。要么根本不应该释放任何内容,要么需要释放在该结构中具有根的对象的整个图形。
规则很简单,每个人malloc()
必须对应一个人free()
。
1。说这通常会吸引一大堆教条主义者“你必须释放一切”抗议,但这种抗议在某种程度上是错误的。 C++ Faq discusses 问题很好。一个问题是,在页面上或触摸大量页面时,操作系统可以作为一个块释放它是缓慢而毫无意义的。但是,是的,有一种观点认为这是一个很好的设计模式,良好的实践,如果有可能将代码合并到第二个程序中,那么应该永远释放内存。