据我了解,此代码适用于二进制搜索树析构函数:
~tree(){
remove(root);
}
void remove(node* root)
{
if (root == NULL) return;
remove(root->left);
remove(root->right);
delete root;
}
但是,我想知道以下对析构函数的调用是否有效?
~node(){
delete left;
delete right;
}
~tree(){
delete root;
}
我的理解是,删除根节点将自动调用子节点,并同时删除它们。这是正确的假设吗?如果确实是正确的,那么有什么简单的方法可以验证析构函数是否正常工作?
{{帖子的此部分已在以后添加}}
我在这里使用第二种方法。通过输出表达式验证,下面的代码似乎不起作用,因为我得到的是单个delete输出(这似乎是针对根节点的)
struct node{
~node(){
delete left;
delete right;
}
};
class tree {
node* root;
public:
tree(){
root=NULL;
}
~tree(){
cout<<"Deleting: "<<endl;
delete root;
}
void insert (int x){};
}
int main(){
A.insert(12);A.insert(13);A.insert(10);
return 0;
}
这是我得到的输出:
Deleting:
理想情况下,应该有3个这样的表达式,但我只能得到1个。
是的,只要叶节点的左和右等于nullptr,它将起作用。
根据C ++标准(5.3.5删除)
6如果delete-expression的操作数的值不是空指针值,则delete-expression将为要删除的对象或数组元素调用析构函数(如果有)。对于数组,元素将按照地址递减的顺序销毁(即,按其构造函数完成的相反顺序;请参阅12.6.2)。
因此,仅当节点不是空指针值时才调用节点的析构函数。
如果要检查析构函数确实在工作,则只需在析构函数的主体中插入输出语句即可。
这是一个示范节目
#include <iostream>
struct node
{
node *next;
int x;
~node()
{
std::cout << "inside node: " << x << std::endl;
delete next;
}
};
void push_front( node **tree, int x )
{
node *n = new node;
n->x = x;
n->next = *tree;
*tree = n;
}
void clear( node **tree )
{
delete *tree;
*tree = nullptr;
}
int main()
{
node *tree = nullptr;
for ( int i = 0; i < 10; i++ ) push_front( &tree, i );
clear( &tree );
}
输出是
Compiled with /EHsc /nologo /W4
main.cpp
Compilation successful!
Total compilation time: 187ms
inside node: 9
inside node: 8
inside node: 7
inside node: 6
inside node: 5
inside node: 4
inside node: 3
inside node: 2
inside node: 1
inside node: 0
Total execution time: 734ms
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句