树结构中的读取访问冲突

Read access violation in tree structure

我正在处理这个作业,但我似乎无法阻止这个读取访问冲突错误。我是 C++ 的新手,我认为我的部分问题是在不需要指针时使用指针(我认为),但我也查看了这段代码并使用我认为我的调试器多次跟踪它我遗漏了一些明显的东西。

作业是实现霍夫曼编码器。为此,我必须创建一个 HuffmanTree class 和一个 HuffmanProcedure class,并且我获得了一个(大部分)完整的 Heap class (minheap)。

HuffmanProcedure class 必须使用堆 class 来存储和创建 HuffmanTrees,直到我对每个小写字母都有一个 Huffman 代码。

当 运行 代码时,我在为 Tree 析构函数 treeRemovalHelper.

编写的帮助程序中遇到读取访问冲突错误

我得到的具体错误(使用 Visual Studio 2019 targeting C++11): Exception thrown: read access violation. root was 0xDDDDDDDD

这里是错误发生的地方:

// Destructor
HuffmanTree::~HuffmanTree() {
  if (rootPtr != nullptr) {
    rootPtr = treeRemovalHelper(rootPtr);
  } else {
    delete rootPtr;
  }
}
// Helper
HuffmanTree::Node* HuffmanTree::treeRemovalHelper(Node* root)
{
  if (root == nullptr) {
    return nullptr;
  }
  else {
      treeRemovalHelper(root->rightChild); // THIS IS WHERE I GET THE ERROR
      treeRemovalHelper(root->leftChild);
      delete root;
  }

  return nullptr;
}

你能帮我指明正确的方向吗?

我很乐意提供我的完整代码,以防万一。我想指出,所有代码都是我的,除了 Heap class 中的一些方法(导师提供的,我在代码中注明)。

这是 HuffmanTree 的三个构造函数 class:

HuffmanTree::HuffmanTree() : rootPtr(nullptr)  {}

HuffmanTree::HuffmanTree(const char letter, const int weight) {
  rootPtr = new Node{
    letter,
    weight,
    nullptr,
    nullptr
  };
}

HuffmanTree::HuffmanTree(HuffmanTree* smallestTree, HuffmanTree* secondSmallestTree)
{

  int mergedWeight = smallestTree->rootPtr->weight + secondSmallestTree->rootPtr->weight;

  char tempChar;

  if (smallestTree->rootPtr->letter < secondSmallestTree->rootPtr->letter) {
    tempChar = smallestTree->rootPtr->letter;
  } else {
    tempChar = secondSmallestTree->rootPtr->letter;
  }

  rootPtr = new Node{
    tempChar,
    mergedWeight,
    smallestTree->rootPtr,
    secondSmallestTree->rootPtr
  };
}

我发现了你的问题: 删除根后,记得将其设置为nullptr。

// Helper
HuffmanTree::Node* HuffmanTree::treeRemovalHelper(Node* root)
{
  if (root == nullptr) {
    return nullptr;
  }
  else {
      treeRemovalHelper(root->rightChild); // THIS IS WHERE I GET THE ERROR
      treeRemovalHelper(root->leftChild);
      delete root;
      root = nullptr; -->> FIX
  }

  return nullptr;
}