2016-11-09 111 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;