首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确释放某些malloc的数组元素?

如何正确释放某些malloc的数组元素?
EN

Stack Overflow用户
提问于 2011-04-14 13:13:49
回答 1查看 4.5K关注 0票数 2

我使用了以下结构和方法:

代码语言:javascript
复制
struct cell {
    double x, y, h, g, rhs;
    struct key *keys;
};

void cellFree(struct cell *c)   {
    free(c->keys);
    c->keys = NULL;
    free(c);
    c = NULL;
}

void cellCopyValues(struct cell *targetcell, struct cell *sourcecell)   {
    targetcell->x = sourcecell->x;  
    targetcell->y = sourcecell->y;  
    targetcell->h = sourcecell->h;  
    targetcell->g = sourcecell->g;  
    targetcell->rhs = sourcecell->rhs;  
    keyCopyValues(targetcell->keys, sourcecell->keys);
}

struct cell * cellGetNeighbors(struct cell *c, struct cell *sstart, struct cell *sgoal, double km)  {
    int i;

    // CREATE 8 CELLS
    struct cell *cn = malloc(8 * sizeof (struct cell));

    for(i = 0; i < 8; i++)  {
        cn[i].keys = malloc(sizeof(struct key));
        cellCopyValues(&cn[i], c);
    }


    return cn;
}

struct cell * cellMinNeighbor(struct cell *c, struct cell *sstart, struct cell *sgoal, double km)   {
    // GET NEIGHBORS of c
    int i;
    struct cell *cn = cellGetNeighbors(c, sstart, sgoal, km);
    double sum[8];
    double minsum;
    int mincell;

    cellPrintData(&cn[2]);

    // *** CHOOSE A CELL TO RETURN
    mincell = 3; // (say)


    // Free memory
    for(i = 0; i < 8; i++)  {
        if(i != mincell)    {
            cellFree(&cn[i]);
        }
    }

    return (&cn[mincell]);
}

当我调用cellMinNeighbor()时,我需要根据选择标准返回8个衍生邻居中的一个(来自cellGetNeighbors()) -然而,我应用于释放其他元素的当前方法似乎给了我以下错误:

代码语言:javascript
复制
*** glibc detected *** ./algo: free(): invalid pointer: 0x0000000001cb81c0 ***

我做错了什么?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-14 13:23:35

您正在分配一个数组,然后尝试释放特定的成员。

您的cn被分配为一个8 struct cell的数组,但您实际上是在尝试释放&cn[0], &cn[1], &cn[2],它实际上并没有使用一个需要它自己的空闲空间的malloc来分配。

您应该只释放通过malloc获得的指针,并且要记住的一条很好的规则是,释放的数量必须与mallocs的数量相对应。

在本例中,您使用malloc cn和各个密钥,而不是&cn[1]等,因此释放它们是错误的。

如果你算上mallocs,你有9,但是free是mallocs。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5658856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档