web-dev-qa-db-fra.com

malloc: *** erreur pour l'objet: le pointeur libéré n'a pas été alloué *** définir un point d'arrêt dans malloc_error_break à déboguer

Quelqu'un peut-il m'aider à comprendre où je reçois cette erreur. Je sais que c'est probablement une double suppression ou quelque chose comme ça. Pour le fond, c'est une implémentation de l'arbre de Huffman comme vous pouvez facilement le constater sur wikipedia .

implémentation de la classe 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);
  }
}
14
waldyr.ar

Le problème vient de ce code:

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

Cela obtient des pointeurs vers des variables locales, qui seront réinitialisées la prochaine fois dans la boucle. CharCountNode tentera éventuellement de delete ces objets, mais ils n'ont pas été alloués par new.

Vous devez faire pointer left et right vers les objets alloués sur le tas, car c'est ce que CharCountNode attend. Quelque chose comme:

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