2015-04-01 2 views
0

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

По какой-то причине я не могу освободить свой массив из памяти.

struct queue { 
    element_t *arr; // dynamic array containing data elements 
    int current_size; // Counts number of elements in the queue 
    int front, rear; // Remark for later: extra fields need to be added here to make it a thread-safe queue as needed for the assigment 
}; 


queue_t* queue_create(){ 
    struct queue *queue = malloc(sizeof(struct queue)); 

    if(queue == 0){ //check if memory available 
    printf("Out of memory\n"); 
    return NULL; 
    } 

    queue -> current_size = 0; 
    queue -> front = -1; 
    queue -> rear = -1; 
    queue -> arr = malloc(QUEUE_SIZE*sizeof(element_t)); 
    return queue; 
} 

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

void queue_free(queue_t** queue){ 
    free(**queue -> arr); 
    free(*queue); 
} 

Когда я звоню последняя функция я получил сообщение об ошибке, говорящее:

queue.c: In function ‘queue_free’: 
queue.c:39:16: error: request for member ‘arr’ in something not a structure or union 
    free(**queue -> arr); 
       ^

Я уже проверил с Valgrind на наличие утечек. Очередь освобождается правильно, но по какой-то причине я не могу получить адрес своего массива.

Заранее благодарен

P.S. free (queue -> arr); free (* queue -> arr); и free (** queue -> arr); все сбой и генерируют одно и то же сообщение об ошибке.

+1

Вы пробовали 'free ((* queue) -> arr)'? –

+1

Что ты имеешь в виду? вы публикуете ошибку компилятора, а затем говорите о valgrind? Как, если у вас нет исполняемого файла? Btw. if должен быть 'free ((* queue) -> arr);' –

+0

Фактически, я думал, что вы были разыменованы короткими: free (* (** queue) -> arr); –

ответ

1

Бесплатное заявление должно выглядеть как free((*queue)->arr).

Объяснение: queue_free определяет переменную queue как указатель на указатель на структуру queue_t. Теперь, чтобы перейти к указателю на структуру, вам нужно удалить один уровень косвенности, используя (*queue); то вы можете использовать оператор разыменования -> для доступа к члену arr.

Теперь, причина, почему другие варианты не работают для вас:

  • free(queue -> arr) - указатель на указатель на структуру queue_t не имеет arr член
  • free(*queue -> arr) - разыменовать оператор ('*') относится ко всему выражению, т.е. queue->arr, который доставит вас обратно к предыдущей ошибке
  • free(**queue -> arr) - такие же, как и выше
Смежные вопросы