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

时间:2011-02-06 18:53:46

标签: c struct free typedef

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

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

是否需要释放此结构?如果是这样,我怎么能释放它?

4 个答案:

答案 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 问题很好。一个问题是,在页面上或触摸大量页面时,操作系统可以作为一个块释放它是缓慢而毫无意义的。但是,是的,有一种观点认为这是一个很好的设计模式,良好的实践,如果有可能将代码合并到第二个程序中,那么应该永远释放内存。