2014-05-01 69 views
0

如何正确释放一个结构?如果我有这是正确的?或者只是打电话免费一次是正确的?如何正确释放结构? ANSI C

typedef struct AStruct{ 
    char * buffer; 
    int size; 
} AStruct; 

typedef struct S_Session { 
    int Id; 
    AStruct* buff; 
    char * name; 
} S_Session; 

S_Session* S_Session_new() { 
    S_Session* s = (S_Session*)malloc(sizeof(S_Session)); 
    s->Id = 1; 
    s->buff = (AStruct*)malloc(sizeof(AStruct)); 
    s->buff->buffer = malloc(8196); 
    s->buff->size = 8196; 
    s->name = malloc(100); 
    return s; 
} 

int main(int argc, char *argv[]) 
{ 
    S_Session* sess = S_Session_new(); 
    free(sess->buff->buffer); 
    free(sess->buff); 
    free(sess->name); 
    free(sess); 
} 
+2

你拥有它的方式是正确的。 –

+0

你已经调用了'malloc()'四次,所以你必须调用'free()'四次。 – EJP

+0

它看起来不错。为了获得额外的分数,可以构造一个'S_Session_free()'函数来缩小它并匹配你的构造函数。不要忘记检查所有'malloc()'的返回值,并放弃两个不必要的转换。 –

回答

1

与其他人一样的规则已经说是释放你分配的一切,所以从你的代码,您有4个的malloc的,当节目结束,这是正确的,你拨打免费为那些mallocs。

在C中没有任何东西是自动的,所以如果您决定只通过您分配的结构调用free,那么您分配的剩余内存将不会被释放。

但是,对于一个简单的程序来说,在程序结束后,进程被终止并且内存被操作系统释放,所以如果你释放的只是结构,那将是世界末日。

作为一个好习惯,你应该在你的程序终止之前释放所有的分配内存。

0

在C中,您不应该输入malloc()的返回值。它可以在原型丢失的情况下掩盖错误,并且使用该值的最坏情况的结果可能是崩溃。

一般来说,在对其执行操作之前,您应该检查函数调用结果的有效性。在这种情况下,检查malloc()实际上是否成功将避免在系统内存不足时发生意外崩溃。

由于您可以准确计算出您需要的内存量,因此您可以实现您的S_Session_new()以执行所需内存的单次分配,并将指针设置为该内存中的正确位置。这样做可让您通过一次性拨打free()来释放该内存。

S_Session* S_Session_new() { 
    char *mem; 
    S_Session* s = 0; 
    size_t sz = 0; 

    sz += sizeof(S_Session); 
    sz += sizeof(AStruct); 
    sz += 8196; 
    sz += 100; 

    mem = malloc(sz); 
    if (mem) { 
     s = (void *)mem; 
     s->Id = 1; 
     s->buff = (void *)(mem += sizeof(S_Session)); 
     s->buff->buffer = (void *)(mem += sizeof(AStruct)); 
     s->buff->size = 8196; 
     s->name = (void *)(mem += 8196); 
    } 
    return s; 
} 
+0

这可能会导致未定义的行为,具体取决于实施的对齐要求。 –

+0

@MattMcNabb:该技术的用户必须注意对齐问题。该代码假定'sizeof S_Session'边界上的指针对'AStruct'具有足够的对齐。对于分配给char *的字段没有对齐问题。 – jxh