2015-10-15 5 views
1

У меня есть структура complex и структура complex_set (набор комплексных чисел), и у меня есть функции «конструктор» и «деструктор» alloc_set и free_set.Как освободить массив структур

Моя проблема в том, что я получаю следующее сообщение об ошибке во второй итерации для цикла в free_set:

malloc: *** error for object 0x1001054f0: pointer being freed was not allocated 

Что такое правильный способ деинициализации complex_set? Мне интересно, нужно ли освобождать свойство *points от complex_set, только позвонив по номеру free (а затем освободите остальные) или освободив каждый элемент отдельно? Или я уже сделал что-то неправильно в инициализации?

Вот код:

typedef struct complex complex; 
typedef struct complex_set complex_set; 

struct complex { double a; double b; }; 
struct complex_set { 
    int num_points_in_set; 
    complex *points; // an array of struct complex 
}; 

struct complex_set *alloc_set(complex c_arr[], int size) { 
    complex_set *set = (complex_set *) malloc(sizeof(complex_set)); 
    set->num_points_in_set = size; 
    // i think i may even just use the pointer c_arr as '*points' 
    // however, i want to make sure malloc was called 
    set->points = (complex *) malloc(size*sizeof(complex)); 
    for (int i=0; i<size; i++) { 
     set->points[i] = c_arr[i]; 
    } 
    return set; 
} 

void free_set(complex_set *set) { 
    complex *current = set->points; 
    complex *next = NULL; 
    int iterations = set->num_points_in_set; 
    for(int i=0; i<iterations; i++) { 
     next = current + 1; 
     // i get the error here, in the second iteration: 
     free(current); 
     current = next; 
    } 
    free(set); 
    set = NULL; 
} 
+2

Вы должны иметь один 'free' для каждого' malloc'. В вашем распределении у вас есть ровно два 'malloc', но в вашем свободном вы много раз вызываете' free'. Исправьте это –

+0

Спасибо! Поэтому для массива структур мы должны только один раз вызвать вызов (по указателю на начало). – ndrizza

+1

Вы вызываете 'free' один раз за каждый раз, когда вы называете' malloc' один раз, нет более простого способа сказать это действительно –

ответ

4

Вы только сделали один malloc() для set->points, так что вы должны делать только один free().

Вы пытаетесь освободить каждую точку.

1

Это так просто, как это: free(set->points);

+0

Я вижу, что это правильное решение, но это не объясняет почему. – ndrizza

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