我有以下代码:
template<class T>
class List<T> {
class Node{
T data;
Node * next;
...
};
Node * head;
...
~List() {/*iterating through all nodes and deleting them*/}
...
};
template<class T>
class Tree<T> {
class Node {
Node * next;
...
T key;
List<int> internal_list;
};
destroy_node(Node * x) { delete x; }
};
destroy_node(Node * x)
是否会调用List<T>
类的析构函数,还是需要显式调用它?
答案 0 :(得分:5)
是
一个类的析构函数总是调用所有子对象&#39;析构函数,与构造的顺序相反。
无论它们是虚拟基类,普通基类还是成员子对象都无关紧要。
(virtual
基类总是由最派生类直接构造和销毁,而不是由基类构造。
如果你通过既不是最衍生类型的指针来破坏一个对象,也没有拥有virtual
dtor,那么所有的赌注都会被取消。)
答案 1 :(得分:0)
当一个类被破坏时,所有非指针成员的析构函数都会被自动调用。对于指向动态分配有new
/ new[]
的对象的指针的任何成员,或者使用内存函数动态分配的内存块,您必须使用delete
/ {{1}自行释放它们或者适当的记忆功能。
是的,在此示例中,销毁delete[]
实例将自动销毁其Node
成员。