У меня есть структура 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;
}
Вы должны иметь один 'free' для каждого' malloc'. В вашем распределении у вас есть ровно два 'malloc', но в вашем свободном вы много раз вызываете' free'. Исправьте это –
Спасибо! Поэтому для массива структур мы должны только один раз вызвать вызов (по указателю на начало). – ndrizza
Вы вызываете 'free' один раз за каждый раз, когда вы называете' malloc' один раз, нет более простого способа сказать это действительно –