[英]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.