我在删除名为tree2
的私有成员类时遇到错误,我尝试使用"**"
,"&*"
,"*&"
但我只是在出错后不断收到错误。
标题文件:
class tree1
{
private:
class tree2
{
tree2*child;
tree2**child2;
int data;
};
void clear( tree2** the_root);
tree2* root;
};
我是那个把清晰功能放在那里的人。所以我进入.cpp
文件并以这种方式实现:
void tree1::clear(tree2** TheRoot)
{
if(*TheRoot == NULL) { return; }
clear(&(*TheRoot->child1));
clear(&(*TheRoot->child2));
delete TheRoot;
TheRoot = NULL;
}
然后在一个使用clear的函数中,我称之为clear(root)
或clear(&root)
或clear(*root)
或clear(&*root)
。所有组合都失败了,我不断得到错误。删除此课程的正确方法是什么?
答案 0 :(得分:1)
您似乎希望删除后root
- 指针为NULL
。这就是为什么仅仅将tree2*
作为参数传递是不够的并且tree2**
是必要的原因。
行delete TheRoot;
不会删除root,而是删除指向root的指针(在您的示例中未通过new
分配,因此会导致一些隐藏错误。同样的问题出在下一行。您可以通过编写delete *TheRoot; *TheRoot = NULL;
来解决此问题。
但是由于你使用的是C ++,你可以像tree2*&
那样传递:
void tree1::clear(tree2*& TheRoot)
{
if (TheRoot == NULL) { return; }
clear(TheRoot->child1);
clear(TheRoot->child2);
delete TheRoot;
TheRoot = NULL;
}
并将其称为clear(root);
答案 1 :(得分:0)
如果要修改值,则需要使用clear(& root)调用它。在一边,你做* root = null来清除它。
答案 2 :(得分:0)
仅使用tree2
和tree2*
(指向tree2
类型的指针)数据类型就足够了,不要使用tree2**
(指向指针的指针)。 )。
不要指望指向的元素为NULL
,而是将指针值设置为NULL
,只需检查指针值以确定它们是否指向已分配的内存。