我正在尝试实现一个树结构,并且我正在将指向子节点的指针存储在一个数组中。我正在尝试添加节点,但它们没有按预期工作。例如,在代码的某处,指针获得值 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);
}
答案 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} } 使其更加健壮和易于维护。