堆内存中的C ++向量导致分段错误

问题描述

我是C ++的新手,我相信这个问题一定很容易处理,但是我想我错过了一些主要概念。在代码中,实现了一个二叉树,并且要求我们确定该二叉树中的节点数。如您在Node类中所见,一个Node有两个成员指针: left 指向左侧的Node, right 指向右侧的Node。输入是根节点。无论如何,我找到了这样的解决方案:

  1. 制作一个节点向量,在代码中将其命名为 nodes ,并附加根节点,并将节点数(代码中的howManyNodes)设置为1。
  2. 当节点不为空时(在开始时我们添加根节点),请检查其是否具有 left right 指针。如果可用(即不是nullptr),请将这些指针添加到节点的向量中(我使用 insert )。同时,将节点数(代码中的howManyNodes)增加一个。
  3. 检查特定节点是否具有左右指针后,我从列表中删除该节点,并使用 pop_back()函数。
  4. 最后,向量将为空,我将获得howManyNodes作为答案。

这是代码,我仅实现了计数功能。其余的来自模板。

#include <iostream>
#include <vector>


class Node {
public:
  Node *left,*right;
  Node() { left = right = nullptr; }
  ~Node() {
    delete left;
    left = nullptr;
    delete right;
    right = nullptr;
  }
};

// I implement this part
int count(Node *n) {

    int howManyNodes = 1;
    std::vector<Node> *nodes = new std::vector<Node>;
    nodes->push_back(*n);

    while (!nodes->empty()){

      Node* trial = new Node(nodes->back());
      if (trial->left){
          std::cout << trial->left << std::endl;
          nodes->insert(nodes->begin(),*trial->left);
          howManyNodes += 1;
      }
      if (trial->right){
          std::cout << trial->right << std::endl;
          nodes->insert(nodes->begin(),*trial->right);
          howManyNodes += 1;
      }
      nodes->pop_back();
  }
  return howManyNodes;
}
// I implement this part.


int main() {

  Node *n = new Node();
  n->left = new Node();
  n->right = new Node();
  n->right->left = new Node();
  n->right->right = new Node();
  n->right->right->right = new Node();

  // This should print a count of six nodes
  std::cout << count(n) << std::endl;

  // Deleting n is sufficient to delete the entire tree
  // because this will trigger the recursively-defined
  // destructor of the Node class.
  delete n;
  n = nullptr;

  return 0;
}

问题是,我永远也无法摆脱细分错误。正如我所搜索的那样,它发生在代码试图访问它不应该访问的内存时。我的代码可能很容易修复,但是我有以下问题:

  1. 如果std :: vector为其成员使用堆内存,为什么需要在此处定义一个新的vector?在main函数(我没有写过)中,所有内容都是由new编写的,因此我假设我也应该尽可能使用new,但是我不理解其背后的逻辑。
  2. 在我的代码中,我想使用引用,因为我只想访问Nodes的指针而不修改它们-我了解到使用对象本身需要进行复制并减慢了过程,因此并不可取-。我的代码的哪一部分试图修改任何指针?
  3. 现在我定义了一个新的向量,是否应该在返回值之前也将其删除并使其等于nullptr?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)