Возврат выделенной переменной

Я знаю, что мы должны освободить любую переменную, выделенную malloc, но что, если я верну ее в функцию? Что-то вроде этого:

char *somefunction(int somearg){
    char *str;

    str=(char *)malloc(sizeof(char *));

    //some code

    return str;
}

Должен ли я освободить str? Как я могу это сделать?

Ответ 1

У вас есть два варианта: один, передать char * в какую-то функцию и использовать это вместо выделения внутри некоторой функции или двух, освободите возвращаемое значение позже.

Первый вариант:

char *somefunction(char *str, int somearg){

    //some code

    return str;
}

// Elsewhere...
char *str = (char *) malloc....;
somefunction(str, 123);
// Code...
free(str);

Второй вариант:

char *somestr = somefunction(123);
// Do something...
free(somestr);

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

Ответ 2

Вы освободите его, когда закончите с ним. Не существует правила, согласно которому free(), который соответствует malloc(), должен быть в той же функции.

Ответ 3

Вы должны освободить все выделенное пространство, но если вы вернете его, потому что вы будете использовать это пространство памяти в других частях программы, поэтому после его использования вы должны освободить. Смотрите все места в коде, вызывающем функцию, и освободите место после использования возвращаемого значения.

Ответ 4

Если вы намерены вернуть адрес блока, вы не должны освобождать() блок, а вместо этого полагаться на вызывающий код, чтобы освободить() его позже. Это называется передачей полномочий.

Если вы освободите его в функции и вернете указатель, вызывающий код будет запущен в поведение undefined, пытаясь получить доступ к уже освобожденному блоку.

Ответ 5

Это практика для некоторых существующих функций (например, strdup()), но, как правило, это плохая идея. Требование, чтобы пользователь знал о том, что происходит внутри вызова функции, является плохим требованием - подумайте, сколько функций вы используете, какие внутренние лица скрыты от вас. Вообще говоря, вы захотите, чтобы пользователь пропускал в буфере и размере вместо распределения памяти для них.