如何正确释放结构?如果我有这个是对的吗?或者只是被称为免费一次是正确的?
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);
}
答案 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;
}