繁体   English   中英

树结构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;
}
}

请参阅我在第二段代码中的注释,以了解内存访问冲突的位置。 我在想代码中有一些未初始化的东西,但是我真的不知道它在哪里或如何初始化。

任何帮助或指示,将不胜感激!

您需要初始化t->entry

tree_node *t = new tree_node;
t->entry = new IndexEntry;

您正在取消引用未初始化的指针。 执行此操作时:

tree_node* t = new tree_node;

然后编译器将执行实际上不执行任何操作的默认构造函数。 t->entry没有分配任何值,并且包含垃圾。

因此,稍后使用以下方式取消引用它时:

t -> entry -> recNum = rNum; //right here I get a violation

t -> entry ->是取消引用操作),您将获得Undefined Behavior,这将导致崩溃。

解决方案是在取消引用之前初始化t -> entry

tree_nodeentry指针未正确初始化,它是一个指针,并且没有指向有效的对象。 您可以在构造函数中对其进行初始化,并且不要忘记在析构函数中将其删除。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM