你如何管理C中结构的内存?

时间:2011-07-28 20:19:41

标签: c memory-management

我习惯于在Objective-C中保留和释放对象,但由于我通过音频单元处理数据,我需要保持在C级别并且不能利用iOS框架。在这种情况下,我有一个结构保留音频数据,我需要一次保持一堆。一旦我完成,我需要释放那段记忆。

我一直在寻找关于C和结构的内存管理规则的好教程,但我还没有找到一个好的教程。 (谷歌很难获得示例C代码。)

我应该如何管理C结构以便正确发布数据?你知道一个关于管理C结构的好教程吗?

4 个答案:

答案 0 :(得分:4)

没有什么可以做的:malloc用于分配,并且可以免费进行解除分配,总是配对。 它或多或少地作为没有自动释放的Objective-C世界。

答案 1 :(得分:2)

查找抽象数据类型教程。 例如,维基百科页面有一个C样本:http://en.wikipedia.org/wiki/Abstract_data_type

答案 2 :(得分:2)

根据结构的组成,您可能希望实际创建一个函数来处理内存的分配和释放,或者可能为您提供一个句柄,您可以将其用作处理结构缓冲区的不透明数据类型。例如,如果您的结构将包含指向其他内存缓冲区的指针,则不能简单地将对mallocfree的调用与结构缓冲区配对...您需要循环遍历整个缓冲区在释放结构本身之前,首先释放数组并释放结构中的指针,否则你将为结构中的那些指针数据成员创建内存泄漏。

例如,您可以执行以下操作:

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循环来处理缓冲区的结构元素,特别是如果这些结构本身包含你必须处理的动态分配内存的附加指针。

答案 3 :(得分:1)

#include <stdlib.h>

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

请注意:

  • x必须是指针
  • 不需要演员
  • 包含适当的标题

完成后,请致电free