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

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

char *somefunction(int somearg){
 char *str;
 str=(char *)malloc(sizeof(char *));
 //some code
 return str;
}

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

5 ответов

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

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


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


У вас есть два варианта: один, передать 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);

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


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


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

licensed under cc by-sa 3.0 with attribution.