В следующем коде возможно ли утечка памяти?
reference-ril.c
static void requestRadioPower(void *data, size_t datalen, RIL_Token t)
{
....
ATResponse *p_response = NULL;
....
err = at_send_command(cmd, &p_response); // it a memory leakage or not ?
....
at_response_free(p_response);
....
}
И в другой функции:
static void requestOrSendPDPContextList(RIL_Token *t)
{
ATResponse *p_response;
....
err = at_send_command_multiline ("AT+CGACT?", "+CGACT:", &p_response);
// it a leakage or not ?
....
at_response_free(p_response);
....
}
На самом деле, эти функции будут возвращены перед вызовом at_response_free (p_response) в некоторых случаях. Полагаю, мы сначала вызываем ATResponse * p_response в NULL, верно? Установить указатель на NULL - хорошая идея или нет?
Это зависит:
at_send_command_multiline
и at_send_command
посмотреть на значение, указанное своими последними аргументами (&p_response
), тогда вы должны установить их предсказуемыми значениями. Это может означать, что вы установили p_response
в NULL
. Если функции выделяют память для указателя, не глядя на начальное значение, тогда вы в порядке. Чтобы ответить на ваш конкретный вопрос, переменная, объявленная в функции, если не объявлена static
, не имеет значения по умолчанию.at_send_command*
всегда выделяют память для последнего аргумента, вы должны освободить память. Если они распределяют только в случае успеха, то вы должны освобождаться только в случае успеха. Простым правилом является то, что для каждого malloc()
или calloc()
должен быть free()
. (realloc()
немного изменит это, но вам не стоит беспокоиться об этом прямо сейчас).Другими словами, вам нужно посмотреть документацию функций at_send_command*
или посмотреть в определении функций, чтобы полностью ответить на ваши вопросы.
Установка указателя на нуль - это, конечно, хорошая идея; но ни один из них не является утечкой памяти.
Начальное значение указателя в C является мусором, равно как и начальное значение любой переменной, которая не инициализируется. (Это из-за эффективности, или, как мне сказали, и нужно иметь в виду.)