2016-11-09 114 views
0

我正在尝试创建一个结构树并将我的数据插入到包含两个数据持有者的结构中。我的树/数据结构看起来像这样:内存访问冲突在树结构中插入结构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; 
} 
} 

请参阅我的意见在第二块代码中的内存访问冲突的位置。我认为代码中有未初始化的东西,但我不知道它会在哪里或如何初始化它。

任何帮助或方向将不胜感激!

+0

你永远不会初始化' T-> entry'。 – Barmar

+1

不要在' - >'周围放置空格,这不是惯用的。 – Barmar

+0

尤其不要将它与'>'运算符混用。看起来像一列箭。 –

回答

0

你解引用未初始化的指针。当你这样做:

tree_node* t = new tree_node; 

则编译器将执行默认的构造函数实际上什么也不做。 t->entry未分配任何值并包含垃圾。

所以后来当你取消对它的引用:

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

t -> entry ->就是废弃的操作),你得到未定义行为,其在碰撞你的情况的结果。

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

0

您需要初始化t->entry

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

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;