何时会由C语言释放结构体的内存?

6
我是一名有用的助手,可以为您翻译文本。
我有一个关于C结构体和数据类型的问题。我有一个名为test的结构体:
struct test
{
    char* c;
    char* c2;
};

我正在从一个函数中返回这个结构体:

struct test a()
{
    struct test t = { "yeah!", "string" };
    return t;
}

我的问题是结构体的内存是否会自动释放,还是我需要通过free()手动释放。
[更新来自评论:]
函数a在DLL中,我想在主程序中使用这个结构体。

3
自动完成。 - Sourav Ghosh
1
由于结构体被复制到调用方,更有趣的问题是:"结构体成员引用的字符串字面值将保持有效多长时间?" - alk
1
你可以更简单地实现这个功能,只需使用return (struct test) {"yeah!", "string"}; - Michael Vietluzhskih
1
哦,好的,没注意到,谢谢。 - Luca Schimweg
2
相关(关于成员指向的内容):https://dev59.com/YWkw5IYBdhLWcg3wVpBi - alk
显示剩余2条评论
3个回答

5

你只应该释放已经使用malloc(或其他类似函数)分配的内存。既然没有使用malloc,就不应该释放任何东西。


1
但是我可以使用这个结构体多久呢?函数a在一个DLL中,我想在主程序中使用这个结构体。编译器如何知道何时删除这个结构体? - Luca Schimweg
编译器在执行 return t 时使用 memcopy 来复制结构体。不幸的是,DLL 在使用字符串字面量("yeah!","string")返回数据时做得很糟糕。这些字符串的生命周期通常与大多数系统上 DLL 的内存一样长,因此返回的内存大多数情况下无法使用。更好的解决方案是在堆上分配内存,进行字符串复制,然后返回结构体。调用者在完成结构体后进行释放。 - Chintan
@Chintan,没有这样的保证。结构体返回值可能也在寄存器中。 - Antti Haapala -- Слава Україні
@LucaSchimweg,这就是为什么它被称为“自动”变量 - 编译器会自动管理其生命周期。 - SergeyA
我非常希望那个给我点踩的人能够解释一下他点踩的原因。 - SergeyA
好的,谢谢。看起来我可以毫无问题地使用这个变量。 - Luca Schimweg

3
TL/DR版本: 你不需要手动释放任何内容;你可以像对待任何标量变量一样处理这个结构体实例。 稍长版本: 结构体实例t具有自动存储期限,意味着它的生命周期延伸到a函数的生命周期; 一旦a退出,为t分配的任何内存都将被释放。 t的内容的副本将返回给调用者。
至于那些内容... cc2指向字符串字面值;字符串字面值是这样分配的,以便它们的生命周期延伸到整个程序的执行。 因此,在从a返回t之后,cc2中的指针值将是有效的;事实上,这些指针值将在程序的生命周期内有效。
你只需要对通过malloccallocrealloc分配的内容调用free

0

你不必释放非动态分配的内存。但是,如果你想在另一个函数中使用该结构体,你必须传递该结构体的地址,并将其作为(struct *)使用,否则你将无法再次使用它。


1
不对。结构体可以(而在这种情况下确实是)通过值传递。 - Mad Physicist
我从不否认这一点,请停止无端地踩我。 - Yanis Ismail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接