简体   繁体   English

C“未分配指针释放”错误

[英]C “pointer being freed was not allocated” error

I'm experimenting with a quadtree implementation found online, but am receiving "pointer being freed was not allocated" errors intermittently as part of the following (stripped down) _node_release function: 我正在尝试在线找到的四叉树实现,但是作为以下(精简的)_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
}

Would I be correct to assume that node is being incorrectly free'd twice here? 我是否正确地假设节点在这里被错误地释放了两次? The _node_release function free's the node passed to it, but the code is also attempting to free each subsequent subnode after making a recursive call to _node_release. _node_release函数释放传递给它的节点,但是代码也尝试在递归调用_node_release之后释放随后的每个子节点。

Yes you are correct with this assumption. 是的,您对这个假设是正确的。

The problem is in your recursive call. 问题出在您的递归调用中。 Suppose I am a subnode in the recursive call. 假设我是递归调用中的子节点。 When I am done calling free on my subnodes, i then execute my last line, free(node) to free myself. 当我完成子节点上的free调用后,然后执行我的最后一行free(node)释放自己。

Now i'm the parent of this node. 现在我是该节点的父节点。 I do the same routine. 我执行相同的程序。 One of my subnodes, however, was the guy who just freed himself. 但是,我的子节点之一是刚刚释放自己的那个人。 So when I call free(node->subnodes[i]) I get the error that you see 因此,当我调用free(node->subnodes[i])我得到了您看到的错误

Yes you are freeing your nodes twice. 是的,您要释放两次节点。

 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: }

Lets say you have NodeB as a child of NodeA 假设您将NodeB作为NodeA的子代

_free_release(NodeA)
    _free_release(NodeB) – line 7
        free(NodeB) - line 14
    free(NodeB) - line 8

To fix this just remove the free on 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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM