如何释放仅包含指针的结构

我有一个结构,你在下面看到:

typedef struct _List { Person *person; // pointer for people list DoList *do; // Kinda timer, for checking list in some intervals } List; 

有没有必要释放这个结构? 如果是这样,我怎么能免费呢?

如果动态分配结构,则必须释放结构。 如果动态分配成员并且在其他任何地方没有对它们的引用,则必须在释放结构之前释放其成员。

这里有些例子:

 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 ); } 

如果你使用malloc()分配了一个对象,那么你需要在某个时候free()它。

 void free_mystruct(struct_List *a_ptr){ free(a_ptr->person); free(a_ptr->do); free(a_ptr); } 

如果您使用malloc初始分配内存。

这取决于…

所以你问“……任何需要自由……?” 答案是“这取决于”。

  • 如果几乎需要结构直到程序通过main(), exit()或一个信号的返回终止,那么不管它是什么,都不应该释放它。 1

  • 如果资源是在一个长期存在的进程(如编辑器或服务器守护程序)中动态分配的,但是如果在事务或一段时间之后不再需要它,那么是的 ,它确实需要被释放或者程序将具有内存泄漏

  • 如果包含的对象也是动态分配的,则释放结构将产生内存泄漏。 要么根本不应该释放任何内容,要么需要释放在该结构中具有根的对象的整个图形。

规则很简单,每个malloc()必须对应一个单独的free()


1.说这通常会吸引一大堆教条主义者“你必须解放一切”抗议,但这种抗议活动部分被误导了。 C ++ Faq很好地讨论了这个问题。 一个值得关注的问题是,访问或触摸操作系统可以作为块释放的大量页面是缓慢且毫无意义的。 但是,是的,有一种观点认为这是一个很好的设计模式,良好的实践,如果有可能将代码合并到第二个程序中,那么应该永远释放内存。