我的编码器中双重免费或损坏(fasttop)

时间:2014-05-07 23:56:15

标签: c tree free encoder

我的程序涉及将队列中的树列表组合在一起,我的程序编译完美,并且大约有一半的代码可以工作,然后向我抛出这个错误。我把它缩小到涉及我的freeTree以及我如何在encodefile中调用它,对于一些背景故事这是针对基于文本文件中字符频率的编码器,所以如果有一个包含5个不同字符的文本文件,那么这段代码将从队列中的5个不同节点开始。队列中的每个初始节点都保存字符和频率,优先级队列基于频率,并使用仲裁器作为字符的数值。

malloc_printerr (action=3, str=0x7ffff7b98938 "double free or corruption (fasttop)", ptr=0x6034b0) at malloc.c:5027

这就是结构的样子,符号代表字符,权重是频率

struct treeNode
{
  unsigned char symbol;
  unsigned long weight;
  struct treeNode* left;
  struct treeNode* right;
  struct treeNode* next;
};

struct queue
{
  struct treeNode* first;
  struct treeNode* last;
};

这是我的freeTree方法

void freeTree( struct treeNode* root )
{
  if( root != NULL )
  {
    freeTree( root->left );
    freeTree( root->right );
    free( root );
  }
}

这些是我在代码主要部分中使用的变量或treeNodes

  struct treeNode* newNode;
  struct treeNode* holder;

这就是所有被调用的地方应该通过我的队列将两个节点组合成一个树,顶部的节点等于两个输入节点的权重,这应该继续直到只有队列包含一棵大树

while( treeCount > 1 )
  {
    newNode = combineTwo( q->first, q->first->next );
    if( charCount == 2 )
    {
      holder = q->first;
      q->first = q->first->next;
      freeTree( holder );
      holder = q->first;
      q->first = newNode;
      freeTree( holder );
    }
    else
    {
      holder = q->first;
      q->first = q->first->next;
      freeTree( holder );
      holder = q->first;
      q->first = q->first->next;
      freeTree( holder );
      insertSortedNode( q, newNode );
    }
    charCount--;
    holder = NULL;
  }

这是我的combineTwo方法,它将使两个输入节点成为一个节点上的叶子

struct treeNode* combineTwo( struct treeNode* first, struct treeNode* second )
{
  struct treeNode* newNode = createNode( '\0', (first -> weight) + (second -> weight));
  if( first -> weight > second -> weight )
  {
    newNode -> right = first;
    newNode -> left = second;
  }
  if( first -> weight < second -> weight )
  {
    newNode -> left = first;
    newNode -> right = second;
  }
  if( first -> weight == second -> weight )
  {
    if( first -> symbol > second -> symbol )
    {
      newNode -> right = first;
      newNode -> left = second;
    }
    if( first -> symbol < second -> symbol )
    {
      newNode -> left = first;
      newNode -> right = second;
    }
  }
  return newNode;
}

如果需要更多信息,我将整天在这里回答所需的任何问题

1 个答案:

答案 0 :(得分:1)

combineTwo创建一个新节点(可能)将newnode&#39; leftright指向firstsecond参数值。然后,while循环中的代码使用freeTree释放这些指针。

例如:

newNode = combineTwo( q->first, q->first->next ); // newNode->left = q->first (possibly)
if( charCount == 2 )
{
  holder = q->first;
  q->first = q->first->next;
  freeTree( holder );      // freeing the original q->first here. newNode still points to it.

您需要确定新节点的左侧和右侧是否应指向原始树节点,或者是否应删除它们(原始节点)。如果没有无效指针,你就无法做到这两点。