如何正确释放结构? ANSI C

时间:2014-05-01 01:07:31

标签: 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 :(得分:1)

像其他人已经说过的规则就是释放你分配的所有内容,所以从你的代码开始,你有4个malloc,你可以在程序结束时为那些malloc免费调用,这是正确的。

在C中,没有什么是自动的,所以如果你决定只在你分配的结构上调用free,你分配的剩余内存将不会被释放。

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

作为一种好的做法,您应该在程序终止之前释放所有分配内存。

答案 1 :(得分: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;
}