为什么ofstream会搞砸我的指针?

时间:2016-02-10 00:53:14

标签: c++ data-structures heap

void Heap::printHeap(string file) {
  string heapString = "graph {\n";
  for (int i = 1; i < heapSize; i++) {
  Node parentNode = heap[i];
  heapString += parentNode.nodeToDotFormat() + "\n";

  int leftChildIndex = 2 * i;
  int rightChildIndex = 2 * i + 1;
  if (leftChildIndex < heapSize) {
    heapString += parentNode.nodeToDotFormat();
    heapString += "--";

    Node leftChild = heap[leftChildIndex];
    heapString += leftChild.nodeToDotFormat();
    heapString += "\n";

    if (rightChildIndex < heapSize) {
      heapString += parentNode.nodeToDotFormat();
      heapString += "--";

      Node rightChild = heap[rightChildIndex];
      heapString += rightChild.nodeToDotFormat();
      heapString += "\n";
    }
  }
  }
  heapString += "}";
  ofstream out(file);
  out << heapString;
  out.close();
}

我试图打印我的堆。并且堆由具有指针的节点结构组成。出于某种原因,虽然当ofstream在代码下方执行时,它会弄乱我的堆积指针。可能是什么导致了这个?我将如何解决它。

这是执行ofstream行之前的几点:

enter image description here

这是ofstream执行后的样子: enter image description here

正如你所看到的,它改变了左子信和体重,以及正确的子信重量。为什么你认为ofstream导致这种行为?

这是Node结构:

struct Node {
char letter;
int weight;
string nodeInString() {
  string nodeString = "{'";
  char copyletter = letter;
  nodeString.append(&copyletter);
  nodeString += "', ";
  nodeString += to_string(weight);
  nodeString += "}";
  return nodeString;
};
string nodeToDotFormat() {
  string dotString = "";
  char copyletter = letter;
  dotString.append(&copyletter);
  dotString += "_";
  dotString += to_string(weight);
  return dotString;
}

Node *leftChild;
Node *rightChild;
};

1 个答案:

答案 0 :(得分:3)

以下复制初始化会引起一些怀疑

Node parentNode = heap[i];
...
Node leftChild = heap[leftChildIndex];
...
Node rightChild = heap[rightChildIndex];

您似乎Node数组中的 heap对象复制到本地变量。如果您忘记遵循类{3}的三阶规则(或五阶规则)或者错误地实现了相应的函数,那么上述本地对象的析构函数也可能会损坏或破坏{}中的原始对象。 {1}}数组。

但是如果没有看到你的析构,很难说。显示Node及其成员函数的定义。

当然,一个很大的问题是为什么你将这些节点复制到局部变量中?似乎heap函数不需要修改原始节点数据。因此,不需要引入副本。