Вернуть выделенную переменную - PullRequest
10 голосов
/ 20 августа 2009

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

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

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

    //some code

    return str;
}

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

Ответы [ 5 ]

13 голосов
/ 20 августа 2009

У вас есть два варианта: один, передать char * в somefunction и использовать его вместо распределения внутри somefunction, или два, освободить возвращаемое значение позже.

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

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);

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

4 голосов
/ 20 августа 2009

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

2 голосов
/ 20 августа 2009

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

2 голосов
/ 20 августа 2009

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

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

2 голосов
/ 20 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...