Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Будет ли утечка памяти?

#c #указатели #память


Допустим, есть код:

char * str = malloc(16 * sizeof(char));
strcpy(str, "simple_string");
str = strrem(str, "s_");


Функция strrem:

char * strrem(const char * _str, const char * _to_rem)
{
    char * out = malloc(strlen(_str) * sizeof(char));
    ...
    return out;
}


Что станет с первоначальным указателем str и указателем out?
    


Ответы

Ответ 1



Давайте взглянем, что происходит с переменной str во время указанных манипуляций: char * str = malloc(16 * sizeof(char)); /* str * v * +---------+ * | 16 байт | * +---------+ */ Пока все просто - выделили память под 16 байт. strcpy(str, "simple_string"); /* str * v * +---------+ * | 16 байт | = "simple_string" * +---------+ */ На всякий случай, стоит использовать strncpy чтобы не выйти за пределы памяти. str = strrem(str, "s_"); /* ? str * v v * +---------+ +---------+ * | 16 байт | = "simple_string" | 13 байт | * +---------+ +---------+ */ После этого шага str указывает на новую область памяти. Если внутри функции strrem не производится очистка памяти по переданному указателю (а это делать не стоит как минимум потому что туда могут передать указатель на область памяти на стеке), то произойдет утечка памяти. P.S.: Согласно стандарту Си, sizeof(char) всегда возвращает 1

Ответ 2



Буфер, первоначально выделенный под str не освобождается, а указатель на него меняется (теперь указывает на буфер-результат strrem). То есть теперь нет возможности освободить память и до конца жизни процесса она для нас "утекла".

Ответ 3



В этом примере есть ещё одна ошибка: char * out = malloc(strlen(_str) * sizeof(char)); Вы забыли про \0 ! Надо так: char * out = malloc(strlen(_str) * sizeof(char) + 1);

Комментариев нет:

Отправить комментарий