C++ 分段错误和 0xfeeefeeefeeefeee 指针错误

时间:2021-06-22 02:29:34

标签: c++

我正在尝试实现一个树结构,并且我正在将指向子节点的指针存储在一个数组中。我正在尝试添加节点,但它们没有按预期工作。例如,在代码的某处,指针获得值 0xfeeefeeefeeefeee 并且我遇到了分段错误。我对 C++ 指针和内存分配不太熟悉。有人能告诉我这是什么问题吗?

代码:

#include <iostream>
#include <vector>

using namespace std;

class Node{
    public:
    vector <Node*> children = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr};
};

Node parent;

/*
void changePointer(Node **a, Node* b){
    *a = b;
}
*/

void add_to_visited(vector <vector <vector<int>>> arr){
    Node* curr = &parent;
    for (int face=0;face<6;face++){
        for (int row=0;row<2;row++){
            for (int col=0;col<2;col++){
                if (curr->children[arr[face][row][col]]==nullptr){
                    Node temp;
                    curr->children[arr[face][row][col]]=&temp;
                }
                curr = curr->children[arr[face][row][col]];
                //changePointer(&curr, curr->children[arr[face][row][col]]);

            }
        }
    }
}

int main(){
    vector <vector <vector <int>>> arr = 
    {
        {
            {4, 1},
            {2, 4}
        },
        {
            {5, 3},
            {5, 4}
        },
        {
            {2, 0},
            {1, 5}
        },
        {
            {0, 1},
            {2, 0}
        },
        {
            {1, 3},
            {3, 0}
        },
        {
            {5, 2},
            {3, 4}
        }
    };

    add_to_visited(arr);


}

1 个答案:

答案 0 :(得分:1)

正如评论指出的那样:它是一个悬空指针,局部变量的寿命不够长(局部变量 temp 将在最里面的 if 语句之后被销毁)。它可以通过使用指向堆对象的指针来修复(这里是智能指针)

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class Node {
 public:
  static inline size_t kNodes = 6;
  Node() { children.resize(kNodes); }
  vector<std::unique_ptr<Node>> children;
};

Node parent;

/*
void changePointer(Node **a, Node* b){
    *a = b;
}
*/

void add_to_visited(vector<vector<vector<int>>> arr) {
  Node* curr = &parent;
  for (int face = 0; face < 6; face++) {
    for (int row = 0; row < 2; row++) {
      for (int col = 0; col < 2; col++) {
        if (curr->children[arr[face][row][col]] == nullptr) {
          curr->children[arr[face][row][col]] = std::make_unique<Node>();
        }
        curr = curr->children[arr[face][row][col]].get();
      }
    }
  }
}

int main() {
  vector<vector<vector<int>>> arr = {{{4, 1}, {2, 4}}, {{5, 3}, {5, 4}},
                                     {{2, 0}, {1, 5}}, {{0, 1}, {2, 0}},
                                     {{1, 3}, {3, 0}}, {{5, 2}, {3, 4}}};

  add_to_visited(arr);
}

代码异味提示:

不建议在循环中使用硬编码数字6,2,2(一旦我们更改了输入数据,我们可以忘记更改这里的循环),我们可以使用{{1} } 使其更加健壮和易于维护。

Online Demo

相关问题