C“未释放指针被释放”错误

时间:2014-04-22 15:12:58

标签: c memory-management free

我正在尝试在线发现的四叉树实现,但是作为以下(剥离)_node_release函数的一部分,间歇性地接收“指针被释放未被分配”错误:

static void _node_release(node* node)
{
    if(node->subnodes[0])
    {
        for(size_t i=0;i<4;i++)
        {
            _node_release(node->subnodes[i]);
            free(node->subnodes[i]); // this causes "pointer being freed was not allocated" errors
        }
    }
    // ...

    free(node); // the node passed to _node_release is free'd here
}

我认为节点在这里错误地免费提供两次是否正确? _node_release函数free是传递给它的节点,但是在对_node_release进行递归调用之后,代码也试图释放每个后续的子节点。

2 个答案:

答案 0 :(得分:5)

是的,你对这个假设是正确的。

问题在于你的递归调用。假设我是递归调用中的子节点。当我在子节点上完成免费呼叫时,我会执行我的最后一行free(node)以释放自己。

现在我是这个节点的父节点。我做同样的例行公事。然而,我的一个子节点是那个刚刚解放的人。因此,当我致电free(node->subnodes[i])时,我会收到您看到的错误

答案 1 :(得分:0)

是的,您正在释放节点两次。

 1: static void _node_release(node* node)
 2: {
 3:    if(node->subnodes[0])
 4:    {
 5:        for(size_t i=0;i<4;i++)
 6:        {
 7:            _node_release(node->subnodes[i]);
 8:            free(node->subnodes[i]); // this causes "pointer being freed was not allocated" errors
 9:        }
10:     }
11:     // ...
12: 
13:     free(node); // the node passed to _node_release is free'd here
14: }

假设您NodeB

的孩子有NodeA
_free_release(NodeA)
    _free_release(NodeB) – line 7
        free(NodeB) - line 14
    free(NodeB) - line 8

要解决此问题,只需删除第8行的免费

static void _node_release(node* node)
{
    if(node->subnodes[0])
    {
        for(size_t i=0;i<4;i++)
        {
            _node_release(node->subnodes[i]);
        }
    }
    // ...

    free(node); // the node passed to _node_release is free'd here
}