#c
#c
Вопрос:
У меня возникли простые сомнения относительно утечки памяти и освобождения памяти в C. Вот мой простой пример
typedef struct{
uint16 a;
uint8 b[3];
uint8 c;
}log_msg;
typedef struct node{
log_msg list;
struct node *next;
}logs_t;
Это структура, которая у меня есть. Если я сохраню данные в структуре. Затем, если я хочу получить доступ к структуре с помощью указателя, чтобы проверить список msg_log. Необходимо отменить выделение / освободить указатель. Пример,
ret = Check_the_list(data);
uint8 Check_the_list(uint16 data)
{
logs_t *ptr = NULL;
uint8 brk = 0;
ptr = top;
while(ptr != NULL amp;amp; brk == 0)
{
if(ptr->list.a == data)
{
brk = 1;
return 0;
}
else
{
ptr = ptr->next;
}
}
return 1;
}
Здесь необходимо отменить выделение / освободить ptr.Это приведет к утечкам памяти, если эта функция вызывается несколько раз, и я не освобождаю ptr ?. Как я знаю, это автоматически отключит выделение после вызова функции, потому что я не использую динамическую память. Но даже несмотря на то, что я хочу подтвердить с экспертами. Поэтому я прошу экспертов предложить мне.
Комментарии:
1. Какова цель переменной brk, если вы возвращаетесь сразу после ее установки?
Ответ №1:
Да, вам ничего не нужно free()
, поскольку вы не выделили никакой памяти для ptr
in Check_the_list()
.
Самый простой способ запомнить — всякий раз, когда вы выполняете malloc()
/ calloc()
/ realloc()
, тогда вы выполняете a free()
.
В стороне: использование вашего условия цикла brk
не требуется, поскольку вы возвращаетесь сразу после поиска данных. Это brk == 0
излишне, и вы могли brk
бы полностью устранить:
while(ptr != NULL)
{
if(ptr->list.a == data)
{
return 0;
}
else
{
ptr = ptr->next;
}
}
Ответ №2:
Ваша переменная ptr
— это число, выделенное в стеке, которое содержит адрес. Стек «освобождается», когда ваша функция возвращается. Больше нечего освобождать.
Вы должны выполнить то же число free
, что и число malloc
. Если вы сделаете нет malloc
, вы не должны ничего освобождать. Если вы попытаетесь освободить ptr
, это освободит элемент, на ptr
который указывает то, что вам не нужно.