каково начальное значение указателя в файле c - PullRequest
1 голос
/ 02 марта 2010

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

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's 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's a leakage or not ?
    ....
    at_response_free(p_response);
    ....
}

На самом деле, эти функции будут возвращаться перед вызовом at_response_free (p_response) в некоторых случаях. Я полагаю, мы сначала установим ATResponse * p_response в NULL, верно? Установить указатель на NULL - это хорошая идея или нет?

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Это зависит от:

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

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

1 голос
/ 02 марта 2010

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

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

...