指针类成员在通过类方法初始化后保持 NULL
Pointer class member remains NULL after initialization by class method
我正在尝试实现二叉搜索树数据结构。我在使用二叉搜索树类的插入/insert_helper方法初始化我的树时遇到问题。
使用 GDB,我可以看到根数据成员在第一次调用 insert
方法时没有初始化。我很难弄清楚为什么,因为我希望,因为我正在传递指向insert_helper
方法的指针,我应该能够在方法本身中初始化该指针。本质上,为什么在第一次调用insert_helper
时传递root
指针时,我不能正确初始化类root
成员?C++有什么规则不允许这样做?
任何帮助或建议都会很有用。以下是相关的代码片段。
#ifndef BST_H_
#define BST_H_
#include <vector>
#include <iostream>
#include <exception>
template <typename T>
class Bin_Search_Tree {
private:
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef std::size_t size_type;
struct Node {
value_type data;
Node* left;
Node* right;
Node* parent;
};
Node* root;
void free_tree(Node* rnode);
size_type size_helper(const Node* rnode) const;
Node* find_helper(const Node* rnode, const value_type& val) const;
void print_tree_helper(const Node* rnode) const;
bool insert_helper(Node* parent, Node* rnode, const value_type& val);
bool remove_helper(Node* rnode, const value_type& val);
Node* create_node(Node* parent, const value_type& val) const;
Node* get_min(const Node* rnode) const;
public:
Bin_Search_Tree() : root(nullptr) { }
Bin_Search_Tree(const std::vector<value_type>& vals);
~Bin_Search_Tree() { free_tree(root); }
bool empty() const { return (nullptr == root); }
size_type size() const { return size_helper(root); }
Node* find(const value_type& val) { return find_helper(root, val); }
bool insert(const value_type& val) { insert_helper(nullptr, root, val); }
bool remove(const value_type& val);
void print_tree() const { print_tree_helper(root); }
};
template <typename T>
bool Bin_Search_Tree<T>::insert_helper(Node* parent, Node* rnode, const value_type& val) {
if (nullptr == rnode) {
rnode = create_node(parent, val);
return true;
} else if (val == rnode->data) {
return false;
} else if (rnode->data < val) {
return insert_helper(rnode, rnode->right, val);
} else {
return insert_helper(rnode, rnode->left, val);
}
}
template <typename T>
typename Bin_Search_Tree<T>::Node* Bin_Search_Tree<T>::create_node(Node* parent, const value_type& val) const {
Node* inode = new Node;
if (nullptr == inode) {
throw std::bad_alloc();
}
inode->data = val;
inode->left = nullptr;
inode->right = nullptr;
inode->parent = parent;
return inode;
}
在函数中
template <typename T>
bool Bin_Search_Tree<T>::insert_helper(Node* parent, Node* rnode, const value_type& val) {
if (nullptr == rnode) {
rnode = create_node(parent, val);
return true;
} else if (val == rnode->data) {
return false;
} else if (rnode->data < val) {
return insert_helper(rnode, rnode->right, val);
} else {
return insert_helper(rnode, rnode->left, val);
}
}
最初,root=nullptr
,因此满足第一个if
条件。然后,使用
rnode = create_node(parent, val);
并返回。但是,rnode
是函数的本地,因为您按值传递根。返回时,指针将被销毁,您将无法再访问分配的内存。此外,您从未对root
指向的位置进行任何更改,因此它仍然是nullptr
。
你可以通过使用这是类的成员函数这一事实来简化事情 - root
成员对该函数可见。因此,您无需将其作为参数传递。它可以直接在函数内部使用,这应该可以解决问题。
相关文章:
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- C++,检查当我无法使用 NULL/0 时是否初始化了变量
- 链表指向 NULL,尽管我已经初始化了这个链表
- = NULL,在 c++98 中初始化非静态数据成员
- 指针类成员在通过类方法初始化后保持 NULL
- 如何将 cin>> 与初始化的字符* 一起使用为 NULL
- 初始化数组中的每个变量以'0'与将它们全部初始化为 null 相同吗?
- 用null C 初始化结构阵列
- 正在初始化指向null的专用指针数组
- C++:无法通过传递给查找器函数来重新分配 null 初始化的对象指针
- ConstexPR 用于派生类中的 null 初始化构造函数
- std::队列初始化与 NULL
- 未初始化的矢量指针不为NULL
- 使用构造函数初始化指向双击列表中NULL的指针
- 初始化char数组以容纳非null终止的字符串
- 如何用NULL(c++)初始化对的向量
- 如何初始化指向null的指针
- 初始化对话框后,子对话框的 hWnd 将重置为 NULL。
- 将char数组初始化为字符串值时,未初始化的索引被设置为null
- 指针初始化:何时给初始化的指针赋NULL值