内存访问冲突在Tree Struct C ++中插入结构

时间:2016-11-09 22:35:47

标签: c++ data-structures struct binary-search-tree

我正在尝试创建一个结构树,并将我的树节点数据插入到包含两个数据持有者的结构中。我的树/数据结构看起来像这样:

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;
}
}

请参阅我在第二个代码块中的注释,了解内存访问违规的位置。我认为代码中有一些未初始化的东西,但我不知道它会在哪里或如何初始化它。

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

3 个答案:

答案 0 :(得分:0)

您需要初始化t->entry

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

答案 1 :(得分:0)

您正在取消引用未初始化的指针。当你这样做时:

tree_node* t = new tree_node;

然后编译器将执行默认构造函数,它实际上什么都不做。 t->entry未分配任何值且包含垃圾。

所以稍后你用以下方法取消引用它时:

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

t -> entry ->是取消引用操作),您将获得未定义的行为,在您的情况下会导致崩溃。

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

答案 2 :(得分:0)

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

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;