2014-01-03 3 views
0

Я не уверен, когда звонить бесплатно? ты можешь помочь мне с этим?Как использовать C бесплатно?

Вот пример кода:

char *array[1000]; 
for(i < 100){ //its example, it isnt correct syntax 
     if(i%2 == 0){ 
      array[i] = someMethod(i); 
     }else{ 
      array[i] = "BLABLABLA"; 
     } 
} 

char * someMethod(int i){ 
     char *pointer; 
     pointer = malloc(i); // some lenght 

. 
. 
. 
. 
. 

     return pointer; 
} 

А теперь, я хочу использовать free и удалить все куче выделяется память, когда я закончил с использованием памяти для предотвращения утечек памяти, как я могу это сделать?

free(array); не работает, сообщая

попытку освободить объект не кучи

+2

'free', что вы' malloc' - здесь каждый элемент в массиве, а не сам массив. – doctorlove

+2

'for (int i = 0; i <100; i + = 2) free (array [i]);' – BLUEPIXY

+0

Спасибо за ваш совет! – user3139356

ответ

2

Вам нужно будет позвонить бесплатно для каждого из элементов array. array - это статический массив (который также является ошибкой, вы получаете attempt to free non-heap object), и именно поэтому вы не можете это сделать free. Элементы с другой стороны динамически распределяются, и вы можете и должны освободить их. Напишите простой цикл и позвоните бесплатно для элементов array.

EDIT: на самом деле вы можете звонить бесплатно только на динамически распределенные элементы array. Поскольку вы назначаете строковые литералы некоторым элементам и распределяете память динамически для других (используя malloc), вам придется использовать вспомогательный массив, в котором вы храните флаг для каждого элемента, который указывает, если он динамически распределен или указывает на строковый литерал , После этого освободите только динамически выделяемые элементы в цикле.

+0

Цикл не будет таким простым. Некоторые элементы указывают на динамически выделенную память, а другие указывают на строковые литералы. – simonc

+1

@simonc ouch Я этого не замечал. Ты прав. Цикл все равно будет простым, но нам нужно будет позаботиться о том, какие элементы динамически выделяются где-то в другом месте. –

2

Вы можете (действительно должны) иметь ровно один звонок до free для каждого звонка до malloc. Поэтому

array[i] = someMethod(i); 

должно быть (позже) в паре с

free(array[i]); 

Это не будет работать, однако из-за

array[i] = "BLABLABLA"; 

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

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

array[i] = strdup("BLABLABLA"); 
-1

Вы должны освободить все элементы.

for(i < 100){ 
if(i%2 == 0) 
    free(array[i]); 
i++; 
} 

Но таким образом весь массив не будет освобожден. поскольку некоторые из них назначили строковые литералы, которые не могут быть освобождены. Вы можете только free воспоминания, которые динамически распределяются подобно использованию malloc или calloc.

+1

Вызов 'free' в строковом литерале не приведет к утечке памяти. Вероятно, это сбой, но это не гарантировано. – simonc

+0

вызов free не вызовет утечки, но если массив [i] = malloc (некоторый размер) и массив [i] = "afdsfaf" выполняется последовательно, 'malloc'-адрес будет потерян, поэтому произойдет утечка. – Dipto

+0

Верно, но это не шаблон, показанный в вопросе. Каждый элемент присваивается один раз - либо динамически распределенной памяти, либо строковый литерал. Я не вижу никакого кода, который перезаписывает назначенные элементы. – simonc

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