Как вы управляете памятью для структур в C? - PullRequest
2 голосов
/ 29 июля 2011

Я привык сохранять и освобождать объекты в Objective-C, но, поскольку я обрабатываю данные через аудиоустройство, мне нужно оставаться на уровне C и не могу использовать платформу iOS. В этом случае у меня есть структура, которая содержит аудио-данные, и мне нужно держать их несколько одновременно. Когда я закончу, мне нужно освободить эту память.

Я искал хорошее руководство по правилам управления памятью для C и структур, но я пока не нашел хорошего руководства. (Для Google сложно получить пример кода C.)

Как мне управлять структурами C, чтобы я мог правильно выпустить данные? Знаете ли вы хороший учебник по управлению структурами C?

Ответы [ 4 ]

4 голосов
/ 29 июля 2011

Ничего особенного не нужно делать: malloc для выделения и free для освобождения, всегда в паре. Он более или менее работает как мир Objective-C без авто-релиза.

2 голосов
/ 29 июля 2011

В зависимости от состава вашей структуры, вы можете создать функцию, которая будет обрабатывать выделение и освобождение памяти, или, возможно, дать вам дескриптор, который вы можете использовать как непрозрачный тип данных для обработки структурного буфера.Например, если ваша структура будет содержать указатели на другие буферы памяти, вы не можете просто связать вызовы с 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 для обработки элементов структуры вашего буфера, особенно если эти структуры сами содержат дополнительные указатели для динамически выделяемой памяти, которые вы должны обрабатывать.

2 голосов
/ 29 июля 2011

Ищите учебники по абстрактным типам данных.Например, на странице Википедии есть пример C: http://en.wikipedia.org/wiki/Abstract_data_type

1 голос
/ 29 июля 2011
#include <stdlib.h>

struct st *x = malloc(sizeof *x); 

Обратите внимание:

  • x должен быть указателем
  • преобразование не требуется
  • включает соответствующий заголовок

Когда закончите с этим, звоните free.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...