内存访问冲突插入结构在树结构c++
Memory Access Violation Insert Struct Within Tree Struct C++
我试图创建一个结构树,并将树节点的数据插入到包含两个数据持有人的结构中。我的树/数据结构是这样的:
class BinarySearchTree
{
private:
struct IndexEntry
{
int acctID; // (key) Account identifier
long recNum; // Record number
};
struct tree_node
{
IndexEntry* entry;
tree_node* left;
tree_node* right;
};
tree_node* root;
public:
BinarySearchTree()
{
root = NULL;
}
bool isEmpty() const { return root == NULL; }
void insert(int, int);
int search(int);
int treeSearch(tree_node*, int);
};
我在插入函数中遇到了内存访问冲突,老实说,这是我第一次尝试结构树,所以我不知道它是否甚至是一个正确的插入函数。但是这里是:
void BinarySearchTree::insert(int rNum, int aNum)
{
tree_node* t = new tree_node;
tree_node* parent;
t -> entry -> recNum = rNum; //right here I get a violation
t -> entry -> acctID = aNum; //but if I remove the assignments
t -> left = NULL; //it gives me a violation further down
t -> right = NULL;
parent = NULL;
if (isEmpty())
root = t;
else
{
tree_node* current;
current = root;
// Find the Node's parent
while (current)
{
parent = current; //This whole block will give me a memory violation
if (t -> entry -> recNum > current -> entry -> recNum)
current = current -> right;
else current = current -> left;
}
if (t -> entry -> recNum < parent -> entry -> recNum)
parent -> left = t;
else
parent -> right = t;
}
}
请参考我在第二块代码中的注释,了解内存访问违规的位置。我认为代码中有一些未初始化的东西,但我真的不知道它在哪里或如何初始化它。
任何帮助或指导将不胜感激!
您正在解引用未初始化的指针。当你这样做时:
tree_node* t = new tree_node;
则编译器将执行默认构造函数,实际上什么都不做。t->entry
没有赋值,包含垃圾。
之后当你用:
解除引用时t -> entry -> recNum = rNum; //right here I get a violation
(t -> entry ->
是解引用操作),你得到未定义的行为,在你的情况下导致崩溃。
解决方法是先初始化t -> entry
再解引用。
需要初始化t->entry
tree_node *t = new tree_node;
t->entry = new IndexEntry;
tree_node
中的entry
指针没有正确初始化,它是一个指针,它没有指向一个有效的对象。你可以在构造函数中初始化它,不要忘记在析构函数中删除它。
struct tree_node
{
IndexEntry *entry;
tree_node *left;
tree_node *right;
tree_node() :
entry(new IndexEntry), // create a new entry object
left(NULL), right(NULL)
{}
~tree_node()
{
delete entry; // release the memory when we're done
}
};
实际上,我不明白为什么首先需要在堆中创建IndexEntry
。似乎entry
是tree_node
的一部分,所以你可以简单地"嵌入"它在tree_node
:
struct tree_node
{
IndexEntry entry; // not a pointer, but an object
tree_node *left;
tree_node *right;
};
当然,当访问entry
的成员时,你需要使用.
:
tree_node *t = new tree_node;
t->entry.recNum = rNum;
t->entry.acctID = aNum;
t->left = NULL;
t->right = NULL;
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?