我正在尝试在线发现的四叉树实现,但是作为以下(剥离)_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进行递归调用之后,代码也试图释放每个后续的子节点。
答案 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
}