В зависимости от состава вашей структуры, вы можете создать функцию, которая будет обрабатывать выделение и освобождение памяти, или, возможно, дать вам дескриптор, который вы можете использовать как непрозрачный тип данных для обработки структурного буфера.Например, если ваша структура будет содержать указатели на другие буферы памяти, вы не можете просто связать вызовы с malloc
и free
для вашего буфера структур ... вам нужно будет перебрать весь массив и освободитьуказатели в структуре прежде, чем вы освободите сами структуры, иначе вы создадите утечки памяти для этих элементов данных указателя в структуре.
Так, например, вы можете сделать следующее:
typedef struct audio_struct
{
int array_size;
unsigned char* buffer;
} audio_struct;
typedef audio_struct* audio_handle;
//this returns an allocated pointer to the caller.
//caller takes ownership of the pointer.
audio_handle alloc_audio_func(int buffer_size)
{
audio_handle temp;
temp = malloc(sizeof(audio_struct) * buffer_size);
return temp;
}
void fill_audio_arrays(audio_handle handle, int buffer_size)
{
for (int i=0; i < buffer_size; i++)
{
handle->buffer = malloc(SOME_SIZE);
handle->array_size = SOME_SIZE;
}
return;
}
//frees the buffer pointed to by the handle (i.e., pointer), and any associted
//dynamic memory being pointed to by each structure's pointer-member
//handle is invalid after function call (i.e., points to deallocated memory)
void dealloc_audio_buffer(audio_handle handle, int buffer_size)
{
for (int i=0; i < buffer_size; i++)
{
free(handle->buffer);
}
free(handle);
return;
}
Таким образом, вам не придется постоянно писать циклы for для обработки элементов структуры вашего буфера, особенно если эти структуры сами содержат дополнительные указатели для динамически выделяемой памяти, которые вы должны обрабатывать.