【发布时间】:2016-01-18 11:28:59
【问题描述】:
我有一个结构和一个返回 Foo 实例的函数,定义如下:
struct Foo
{
int a;
int* b;
};
struct Foo makeFoo(int a, int bSize)
{
struct Foo foo;
foo.a = a;
foo.b = malloc(sizeof(int) * bSize);
for (int i = 0; i < bSize; ++i)
foo.b[i] = i;
return foo;
}
最初,我认为foo 是一个局部变量,当makeFoo 返回时它会消失,但从这个问题Is it safe to return a struct in C or C++?,我知道这样做是安全的。
现在我的问题是什么时候会收集foo 的内存?我必须先free 其b 成员吗?
假设我像这样使用makeFoo:
void barFunc()
{
struct Foo foo = makeFoo(3, 10);
printf("Foo.a = %d;\nFoo.b = [", foo.a);
for (int i = 0; i < 10; ++i)
printf("%d, ", foo.b[i]);
printf("\n");
}
void main(int argc, char* argv)
{
barFunc();
}
当barFunc 返回并且我回到main 时,foo 的内存是否已收集?或者我必须在barFunc 末尾拨打free(foo.b) 吗?
【问题讨论】:
-
如果你有一个malloc,你需要一个免费的来释放它。如果你没有空闲,那么它仍然被分配。
-
是只保留
foo.b的内存还是整个结构? -
@user3629249 - 糟糕的编程习惯是否值得商榷。但是,返回结构的行为是明确定义的。
-
@wildplasser 有点错过目标,我尽可能避免使用 java ;)
-
@user3629249 请理解编码中(几乎)没有绝对的“正确”和“错误”。有指导方针、最佳实践等,它们的存在是有充分理由的。而且,您总是会发现最好不遵循它们的边缘情况。以“永远释放你 malloc 的东西”为例。如果您有一个简单的“管道和过滤器”架构,并且您的一个过滤器需要为一个块分配大量内存,但在处理后退出,那么大量
free()调用只会浪费代码大小和执行时间。
标签: c struct scope dynamic-memory-allocation