2008-10-11 5 views
1

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

+0

Может использовать некоторые пояснения. Вы динамически выделили эту память? Или позвонить в библиотеку, которая сделала это для вас? Вы пытаетесь восстановить память, связанную с автоматической или статической переменной? – dmckee 2008-10-11 18:57:14

ответ

13

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

+0

Проклятия! Опровергнуто снова!Обратите внимание, что некоторые из стандартных функций библиотеки вызывают malloc или calloc и оставляют за собой освобождение памяти от вызывающего. – dmckee 2008-10-11 18:47:50

+0

@dmckee: могут быть сторонние или платформенные API-интерфейсы, требующие освободить() блок, который они возвращают, но я не знаю о каких-либо стандартных библиотечных функциях (кроме выделенных - malloc, calloc и realloc), которые сделай это. – 2008-10-12 00:22:24

1

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

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

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

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

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

Это даст вам массив 200 целых чисел.

1

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

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

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

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

0

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

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

1

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

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

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

Смежные вопросы