【问题标题】:C How to free a dynamic string inside multidimensional dyamic struct?C 如何在多维动态结构中释放动态字符串?
【发布时间】:2017-06-29 06:29:30
【问题描述】:
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);
    }
}

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

【问题讨论】:

  • 你还需要检查(*head)->frame是否不为NULL。
  • 没有看到整个程序就不可能知道为什么它崩溃了,但是你的 freeFrames 函数是错误的,由于冗余的if ((*head)->next != NULL)检查,它不会释放列表的最后一个元素的框架.
  • 摆脱指针和递归将是第一步。
  • 你不认为在做free(*head);之前你还需要一些条件吗?

标签: c memory-management memory-leaks


【解决方案1】:
  1. 您是否正确初始化了指针?如果您没有为它们分配具体值,则必须将它们初始化为 NULL。
  2. 你不能释放空指针,所以你应该检查:if(name) free(name);
  3. 您不能释放字符串文字!所以如果你这样做name = "hello",你的程序肯定会失败。

此外,您还有内存泄漏(从 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多