1.
Как освободить выделенную память, которая использовалась после вызова mallo c?
Я пытался сделать free(dsdata)
в конце программы, но я не уверен, что это правильный путь.
free(dsdata)
нормально, с Вы выделили все пространство одним вызовом malloc
с:
struct datastore1 *dsdata = malloc(30 * sizeof(struct datastore1));
Чтобы процитировать стандарт (C18), 7.22.3.4 - «Функция mallo c» (подчеркните мою):
7.22.3.4 Функция Малло c
Сводка
1
#include <stdlib.h>
void* malloc(size_t size);
Описание
2 The mallo c функция выделяет пространство для объекта, размер которого определяется размером и значение которого не определено.
Возвращает
3 Функция mallo c возвращает либо пустой указатель или указатель на выделенное пространство .
Правильно использовать free(dsdata)
, поскольку malloc
выделил все необходимое пространство сразу и вернул указатель первой структурной переменной этого массива, которая назначена указателю dsdata
.
Функция free()
«знает», что dsdata
является ссылкой на все выделенное пространство. Вам не нужно отдельно освобождать каждую из 30 структур типа struct datastore1
в памяти.
2.
Должен ли я освобождать каждый индекс по отдельности?
Нет, вам не нужно, и, что еще важнее, вы не должны делать это; это будет Неопределенное поведение :
Цитирование из текущего стандарта (C18), 7.22.3.5/3 - «Свободная функция» (выделите мое):
В противном случае, если аргумент не соответствует указателю, ранее возвращенному функцией управления памятью , или если пространство было освобождено при вызове free или reallo c, поведение не определено.