template<class item_type>
struct node{
item_type x;
node<item_type> *left;
node<item_type> *right;
//functions
};
template<class item_type, class param>
class Tree{
node<item_type> *root;
public:
item_type Get_Item(param item);
void Add_Item(item_type item);
void Delete_Item(item_type item);
//more functions
Tree();
};
template<class item_type, class param>
Tree<item_type, param>::Tree()
{
this->root = new node<item_type>;
this->root->left=NULL;
this->root->right=NULL;
}
添加项目:
void Tree<item_type, param>::Add_Item(item_type item)
{
node<item_type> newItem;
newItem.x = item;
node<item_type> *cur = root;
node<item_type> *prev;
if(cur->x==NULL)
cur->x=item;
int ifGreater;
while(cur->left!=NULL || cur->right!=NULL)
{
if(item<cur->x)
{
ifGreater = 0;
prev = cur;
cur = cur->left;
}
else
{
ifGreater = 1;
prev = cur;
cur = cur->right;
}
}
if(ifGreater==1)
prev->right = &newItem;
if(ifGreater==0)
prev->left = &newItem;
}
此功能在cout<<1
;
template<class item_type, class param>
void Tree<item_type, param>::Delete_Item(item_type item)
{
node<item_type> *cur = root;
node<item_type> *prev;
int ifGreater;
if(cur==NULL)
{
cout<<"Not found"<<endl;
return;
}
while(cur!= NULL && (cur->left!=NULL || cur->right!=NULL))
{
cout<<1; //crash occurs RIGHT before here as 1 is never printed
if(item<cur->x)
{
//do something
}
}
问题发生在cout<<1
之前和int ifGreater;
声明之后cout
仅仅是为了测试它运行的位置和停止运行的位置。
我通过调用
int main()
{
Tree<int,int> theTree;
theTree.Add_Item(1); //so the tree isn't empty
theTree.Delete_Item(1);
}
注意:程序甚至没有超过第一次迭代,不正确的内存处理(修复)不是这个特定错误的问题。
答案 0 :(得分:1)
您在以下代码中有未定义的行为:
template <class item_type, class param>
void Tree<item_type, param>::Add_Item(item_type item)
{
node<item_type> newItem;
// ...
if(ifGreater==1)
prev->right = &newItem;
if(ifGreater==0)
prev->left = &newItem;
}
上面,newItem
是一个本地变量,当Add_Item
退出时,您将保持指向该本地井的指针。这可能是导致坠机的原因。
此外,您从未初始化ifGreater
或node<item_type> *prev;
。同样,这会导致更多未定义的行为:
if(ifGreater==1)
prev->right = &newItem;
if(ifGreater==0)
prev->left = &newItem;
你可能最终会引用一些随机内存。这是因为无法保证您的while
循环执行,例如。考虑left
和right
都是NULL
的情况。