C如何在多维动态结构中释放动态字符串?

时间:2017-06-29 06:29:31

标签: c memory-management memory-leaks

struct Link
{
    frame_t *frame;
    struct Link *next;
} typedef link_t;

我在内部为frame_t分配内存 我尝试以递归方式释放它,但程序在我运行时崩溃了。

struct Frame
{
    char            *name;
    unsigned int    duration;
    char            *path;
} typedef frame_t;

在内部我为名称和路径分配内存。

void freeFrames(link_t** head)
{
    if (*head != NULL)
    {
        if ((*head)->next != NULL)
        {
            free((*head)->frame->name);
            free((*head)->frame->path);
            free((*head)->frame);
            freeFrames(&((*head)->next));
        }

        free(*head);
    }
}

我怎样才能为此释放内存?

1 个答案:

答案 0 :(得分:1)

  1. 您是否正确初始化了指针?如果没有为它们分配具体值,则必须将它们初始化为NULL。
  2. 您无法释放空指针,因此您应该检查:if(name) free(name);
  3. 你不能释放字符串文字!因此,如果您执行name = "hello",那么如果您尝试这样做,您的程序将会失败。
  4. 此外,你有一个内存泄漏(偷了那个来自n.m。的评论......):

    if ((*head)->next != NULL)
    {
        free((*head)->frame->name);
        free((*head)->frame->path);
        free((*head)->frame);
        // ^ you will only free, if there is a successor node!
        //   so you won't free them on the last node!
    
        freeFrames(&((*head)->next));
    }
    

    应该是(到目前为止还没有添加NULL检查!):

    if(*head)
    {
        free((*head)->frame->name);
        free((*head)->frame->path);
        free((*head)->frame);
        if ((*head)->next != NULL)
        {
            freeFrames(&((*head)->next));
        }
        free(*head);
    }
    

    另外:你没有给头部指定任何东西(*head = NULL;),为什么你有双指针?

    void freeFrames(link_t* head);
    

    就足够了......

    并且不需要递归,只要有任何指针就可以推进指针:

    void freeFrames(link_t* head)
    {
        while(head)
        {
            // free members, don't forget the NULL checks
            link_t* tmp = head;
            head = head->next;
            free(tmp);
        }
    }