2013-04-27 3 views
0

У меня возникли проблемы с освобождением временного массива структур, используемых для удвоения размера другого массива. Кажется, у меня нет проблем с освобождением исходного массива.Ошибка при освобождении массива malloc'd структур

void foo(StruName **structName,i nt *size) 
{ 
... 
StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName)); 
for (i = 0; i < *size; i++) 
    temp_array[i] = (*original_array)[i]; 
free(*original_array); 
*original_array = temp_array; 
free(*temp_array); 

Я получаю следующее сообщение об ошибке с помощью г ++ -Wall

error: cannot convert ‘StruName’ to ‘void*’ for argument ‘1’ to ‘void free(void*)’ 

Любые идеи, что может быть причиной этого? Если я оставлю свободное (* temp_array); в целом программа компилируется и работает нормально. бесплатно (temp_array); вызывает выдаёт ошибку сегментации

+0

Это помогло бы, если бы вы могли опубликовать всю программу. В любом случае, склонны к ошибкам, которые я указал. Первая строка объявления функции имеет ошибки. –

+0

К сожалению, извините за непонятность. Структурой было имя структуры typedef.Изменил его на StruName – mcallinder

ответ

1

В чем причина, почему original_array является указателем на указатель?

В любом случае, мне кажется, вы не должны освобождать массив temp, так как ваш фрагмент кода подразумевает, что вы заменяете его *original_array. Если это так, вы делаете , работая с освобожденной памятью; это может закончиться некоторое время, но в конечном итоге вы можете найти, что ваши значения массива будут перезаписаны, так как освобожденная память переназначается на что-то еще.

// here *original_array will be pointing to the new `malloc`ed memory 
*original_array = temp_array; 

// After this line, *original_array is left dangling to the recently freed memory 

free(*temp_array); 

Я бы удалил эту последнюю свободную линию.

* Редактировать * Я уже упоминал, что память будет освобождена дважды, это не так, поскольку бесплатно нужно было вызывать без разыменования * temp_array, чтобы это было правдой.

+0

Не могу сказать, что ваш фрагмент кода не содержит ссылки на переменную дней. Как и другие, предложили, было бы удобно, если бы вы разместили больше кода. :) – 2013-04-27 23:49:23

+0

Упс, ха-ха. Читайте это как бесплатно (* original_array): P - Спасибо. Разве это не так много, потому что я все равно переписываю? Я заметил, что программа, похоже, работает нормально с ней или без нее (и valgrind, похоже, не замечает). – mcallinder

2

Следующая часть определения функции не является правильным:

void foo(Struct **structName, int count, int *size) 

Вы объявили о своей структуре, как structName? Если да, вам нужно указать и параметр, а не только его тип. И даже если ваша структура является structName, тогда вы должны написать struct structName** вместо Struct **structName. (Struct - это не то же самое, что и struct в C)

Вот еще одна ошибка:

malloc(*size * 2 * sizeof(original_array) 

вы должны заключить *size в фигурные скобки, как это не ясно, будет ли вы разыменования size или вы разыменования size*2*sizeof(original_array)

0

Это основной принцип использования памяти, который освобождает то, что вы выделили. Если вы освободите то, что вы не выделили, это может вызвать segmentfault.

код выделили память с:

StruName *temp_array = (StruName*) malloc(*size * 2 * sizeof(StruName)); 

Затем он должен освободить память с:

free(*temp_array); 

Убедитесь, что содержание обоих параметров являются правильными.

+0

Привет, Даниэль, кажется, из кода OP, что значение temp_array заменяет * original_array. Если temp_array освобожден, значение * original_array останется болтающимся в освобожденной памяти. – 2013-04-27 23:48:01

+0

@sgorozco вы абсолютно правы. Это должно быть очень осторожным с операциями указателя, особенно в C. И то, что я пытаюсь решить, - это то, что Марк спросил: «Если я оставлю свободный (* temp_array), вообще, программа компилируется и работает нормально. Free (temp_array) ; вызывает segfault « – Daniel

+0

Я имею в виду, если я освобожу temp_array со свободным (temp_array) ;, я получаю segfault. Я думаю, это должно быть потому, что я освобождаю память, которой * original_array назначается в конце блока. – mcallinder

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