[英]C++ pointers not working?
我在使用c ++指针时遇到问题。 我正在尝试通过使用Node结构和Tree结构对八叉树进行编码。 但是,经过测试,我遇到了一个问题。 我的代码无法正常工作的部分如下:
struct Node {
Node* l, *r, *p;
int v;
Node() {}
Node(int _v, Node* _p) : v(_v), p(_p) {}
};
struct Tree {
Node* root;
Tree() : root(0) {}
//...
void insert(int k) {
if (!root) {
root = new Node(k, 0);
return;
}
Node* cur = new Node();
cur->v = root->v;
while (1) {
int x = cur->v;
cout << x << endl;
return;
if (k <= x) {
//cout << x << endl;
//return;
if (!cur->l) {
cur->l = new Node(k, cur);
//splay(cur->l);
return;
} else cur = cur->l;
} else {
if (!cur->r) {
cur->r = new Node(k, cur);
//splay(cur->r);
return;
} else cur = cur->r;
}
}
}
//...
};
int main() {
Tree t = Tree();
t.insert(1);
t.insert(5);
return 0;
}
首先,我在树中插入了一个值为1的节点; 因为没有根,所以树将其根分配为值为1的新节点。然后,当我在树中插入5时,发生了一些奇怪的事情。 如果您按原样保留代码(保留第一个cout),则它将为x打印1。 但是,如果注释掉第一个cout并返回并取消注释第二个cout并返回,则您会发现即使没有进行任何修改,它也会打印出x的随机垃圾编号。 有人可以告诉我怎么了吗?
C ++不会自动初始化类成员。
struct Node {
Node* l, *r, *p;
int v;
Node() {}
Node(int _v, Node* _p) : v(_v), p(_p) {}
};
当您在代码中创建一个新节点时,C ++会为该节点分配一块内存,但不会清除它。 因此,l,r和p的值将是存在的值。
在您的算法中,测试( if (!cur->r)
& (!cur->l)
当前失败,因为节点中存在未初始化的垃圾,而不是NULL
。
结果,当您尝试插入第二个节点时,该算法认为根节点的右边有一个有效节点。 并尝试读取那里的内存和那里的值,即您看到的垃圾x。 根据垃圾值的不同,运行某些代码的人也可能会崩溃:)
我也99.9%确信Node* cur
应该是树中节点的指针,而不是新节点,因此: Node* cur = new Node(); cur->v = root->v;
Node* cur = new Node(); cur->v = root->v;
是错误的,应为Node* cur = root;
正确的初始化-在c ++ 11中,您可以执行以下操作:
struct Node {
Node* l = nullptr;
Node *r = nullptr;
Node *p = nullptr;
int v = 0;
Node() {}
Node(int _v, Node* _p) : v(_v), p(_p) {}
};
除此以外
struct Node {
Node* l;
Node *r;
Node *p;
int v;
Node() : l(NULL), r(NULL), p(NULL), v(0){}
Node(int _v, Node* _p) : l(NULL), r(NULL), p(_p), v(_v) {}
};
您应该按照定义它们的顺序来初始化类的成员。
现在,代码中还有很多其他问题:
unique_ptr
) std::unique_ptr
左右,则会消失)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.