Как освободить память, которая была использована для переменной в C? - PullRequest
1 голос
/ 11 октября 2008

Как я могу освободить память, которую я использовал для переменной (например, длинной строки) в C?

Ответы [ 5 ]

13 голосов
/ 11 октября 2008

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

1 голос
/ 12 октября 2008

На этот вопрос действительно невозможно ответить без дополнительной информации. Единственный способ узнать, как освободить объект (или даже узнать, должен ли он быть освобожден), это узнать, как был выделен объект.

И когда я говорю «объект», я имею в виду не просто «объект» C ++, а «объект», как используется в стандарте C:

область хранения данных в среда исполнения, содержимое который может представлять значения

1 голос
/ 11 октября 2008

Предполагается, что вы не используете malloc и создаете строку или буфер, используя

char array[100];

Но вы знаете, что вы используете его только для очень короткой части длинной функции, вы можете просто поместить эту часть функции в другой набор {}

int reallylongfunction() {
    // Do a lot of stuff
    {
        char stringbuffer[100];
        // Do stuff with the buffer...
        // Ok, we're done with the buffer, and don't want it anymore
    }
    // Do a lot more stuff
    return;
}

Это приведет к тому, что буфер выйдет из области видимости и будет освобожден. Но будьте осторожны, все, что вы объявите внутри дополнительного {}, выйдет за рамки и исчезнет!

Редактировать: Черт, комментарии верны. Статические строки, выходящие из области видимости, не приносят никакой пользы. Отредактировано так, что это просто массив.

1 голос
/ 11 октября 2008

Это действительно зависит от того, как вы объявляете свою переменную - если это обычная переменная, вы не можете «освободить» ее память - она ​​будет освобождена, когда выйдет из области видимости, как здесь:

for (int i=0;i<10;i++) {
 int k=i;
 //do stuff
}

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

Когда речь идет о распределении памяти во время выполнения, вы можете использовать ваш надежный malloc и free:)

int* intArray;
malloc(200 * sizeof(int));

Это даст вам массив из 200 дюймов.

0 голосов
/ 12 октября 2008

Я бы посоветовал вам взглянуть на ustr , который представляет собой строковый API, который вы можете использовать с автоматическими, постоянными и динамически размещаемыми строками ... только две из которых вы можете фактически "освободить" , но все это вы можете обработать одинаково и перейти к ustr_free ().

Возможно, вы все еще захотите узнать о том, как стек, куча и данные (текстовые строки RO) «выделяются» и «освобождаются» ... но при использовании используемого API, пока вы учитесь, это поможет вам много (и будет намного быстрее, чем то, что вы делали бы самостоятельно).

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