malloc: ***错误:释放的指针未被分配***请在malloc_error_break处设置断点以进行调试

14

有人能帮我找出我在哪里犯了错误吗?我知道这可能是双重删除或类似的问题。背景是,这是对哈夫曼树的实现,你可以在维基百科上轻松地了解到相关信息。

CharCountNode类的实现

int main()
{
  ifstream input;
  input.open("input.txt");

  MinPriorityQueue<CharCountNode> heap;
  map<char, int> m;

  while(input.good())
    m[input.get()] += 1;

  for( map<char, int>::const_iterator it = m.begin(); it != m.end(); ++it )
    heap.enqueue(CharCountNode(it->first, it->second));


  while(heap.getSize() > 1)
  {
    CharCountNode a, b, parent;

    a = heap.dequeue();
    b = heap.dequeue();
    parent = CharCountNode('*', a.getCount() + b.getCount());

    parent.left = &a;
    parent.right = &b;

    heap.enqueue(parent);
  }
}

1
在malloc_error_break处设置断点以进行调试。 - Robert Harvey
2
应用 valgrind 并修复它抱怨的第一个问题。重复此过程直到程序正确运行。 - zwol
1
截至本帖发布时:valgrind不支持Mac OS X 10.10。 - CGTheLegend
@CGTheLegend 使用虚拟机。 - Alex
1个回答

12

问题出在这段代码:

parent.left = &a;
parent.right = &b;

这是将指针指向局部变量,下次循环会重新初始化这些变量。 CharCountNode 最终会尝试删除这些对象,但它们并没有通过 new 分配。

你需要让 leftright 指向在堆上分配的对象,因为这正是 CharCountNode 所期望的。可以这样做:

parent.left = new CharCountNode(a);
parent.right = new CharCountNode(b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接