каково начальное значение указателя в файле c

1

В следующем коде возможно ли утечка памяти?

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 - хорошая идея или нет?

Теги:
embedded

2 ответа

3
Лучший ответ

Это зависит:

  • if at_send_command_multiline и at_send_command посмотреть на значение, указанное своими последними аргументами (&p_response), тогда вы должны установить их предсказуемыми значениями. Это может означать, что вы установили p_response в NULL. Если функции выделяют память для указателя, не глядя на начальное значение, тогда вы в порядке. Чтобы ответить на ваш конкретный вопрос, переменная, объявленная в функции, если не объявлена ​​static, не имеет значения по умолчанию.
  • Если функции at_send_command* всегда выделяют память для последнего аргумента, вы должны освободить память. Если они распределяют только в случае успеха, то вы должны освобождаться только в случае успеха. Простым правилом является то, что для каждого malloc() или calloc() должен быть free(). (realloc() немного изменит это, но вам не стоит беспокоиться об этом прямо сейчас).

Другими словами, вам нужно посмотреть документацию функций at_send_command* или посмотреть в определении функций, чтобы полностью ответить на ваши вопросы.

  • 0
    @Alok - «Чтобы ответить на ваш конкретный вопрос, переменная, объявленная в функции, если она не объявлена как static, не имеет значения по умолчанию». чтобы быть немного более понятным здесь, не только нет значения по умолчанию, это может быть любое значение. Поскольку он не объявлен как статический, он создается в стеке и не инициализируется автоматически, поэтому может иметь любое значение, которое могло остаться в стеке.
  • 0
    @simon: вы правы, хотя я избегаю использования слова «стек» для автоматически инициализируемых переменных: в отношении стандарта Си может существовать или не быть стек.
1

Установка указателя на нуль - это, конечно, хорошая идея; но ни один из них не является утечкой памяти.

Начальное значение указателя в C является мусором, равно как и начальное значение любой переменной, которая не инициализируется. (Это из-за эффективности, или, как мне сказали, и нужно иметь в виду.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню