У меня есть структура и функция, которая возвращает экземпляр Foo определяется следующим образом:C: Объем структуры, содержащей динамически распределенный элемент?
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
собраны еще? Или мне нужно позвонить free(foo.b)
в конце barFunc
?
Если у вас есть malloc, вам необходимо бесплатно его освободить. Если у вас нет бесплатной, она остается выделенной. –
Остается только память для 'foo.b' или всей структуры? – 0x56794E
А также хорошо ли это поведение? Или это зависит? – 0x56794E