内存访问冲突插入结构在树结构c++

Memory Access Violation Insert Struct Within Tree Struct C++

本文关键字:结构 c++ 内存 插入 访问冲突      更新时间:2023-10-16

我试图创建一个结构树,并将树节点的数据插入到包含两个数据持有人的结构中。我的树/数据结构是这样的:

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。似乎entrytree_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;