[英]C++ pointers or memory
給定算法,我的代碼似乎應該可以工作,但是我對C ++還是陌生的,當我多次調用insert時,這些指針似乎會覆蓋自身。 例如,如果我用值1、3、5調用insert,則根將為1(按預期方式),但是3將被覆蓋,並且根的右子級將具有值5而不是3。
virtual bool insert(const Data& item) {
if(root == NULL){
BSTNode<Data> newNode (item);
root = &newNode;
isize++;
return true;
}
BSTNode<Data>* nextNode = root;
BSTNode<Data>* prevNode = NULL;
bool isLeft;
while(nextNode!=NULL) {
if (item < nextNode->data) {
prevNode = nextNode;
nextNode = nextNode->left;
//std::cout << prevNode->data;
isLeft = true;
}
else {
prevNode = nextNode;
nextNode = nextNode->right;
//std::cout << prevNode->data;
isLeft = false;
}
}
BSTNode<Data> createNode (item);
createNode.parent = prevNode;
if (isLeft) prevNode->left = &createNode;
else prevNode->right = &createNode;
isize++;
return true;
}
由於指向要銷毀的本地對象,您有一個無效的指針:
BSTNode<Data> newNode (item);
root = &newNode;
對象newNode
是從此方法返回后超出方法范圍的方法insert
的局部對象(指針超出范圍),指針root
將指向已破壞的對象。 解決該問題的一種天真的可能性是通過new
在堆中分配newNode
:
root = new BSTNode<Data>(item);
但是您必須delete
其delete
,並且createNode
也會出現同樣的問題。
正如許多人所建議的那樣,您應該使用智能點,例如unique_ptr
和shared_ptr
。
假設root
是成員變量,則需要在堆而不是堆棧上分配它:
if(root == NULL){
root = new BSTNode<Data>(item);
isize++;
return true;
}
否則,一旦節點超出if
主體的閉合大括號, if
該節點將被銷毀。 同樣的道理
if (isLeft) prevNode->left = new BSTNode<Data>(item);
else prevNode->right = new BSTNode<Data>(item);
我還沒有檢查您的實際插入邏輯。 您應該發布完整的代碼,這里沒有太多可以檢查的代碼。 它是二叉樹嗎?
編輯:根據MM的回答,如果您在堆上創建節點,請不要忘記刪除節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.