我很难通过析构函数删除我的列表。我有一个类列表(充当列表的标题(和类元素(实际上是一个节点(。如何删除列表析构函数中的元素链?
这是 C++ 中用于求职面试的自定义实现。我正在尝试使用 delete_list(( 函数在列表生命周期到期后删除整个列表。我不确定如何完全解决这个问题。我还有一个重载的运算符<<打印出列表,第一次打印后列表完全消失了。
/****************************************************************
* Template Element class, these make up the chain for the list
*****************************************************************/
template<class T>
class Element{
public:
T element;
Element* next;
Element() { element = 0; next = NULL; }
Element(const Element<T>& other): element(other.element), next(other.next) {};
~Element() { next = nullptr; }
};
/****************************************************************
* Template List class
*****************************************************************/
template<class N>
class List{
Element<N>* first;
unsigned size;
public:
/****************************************************************
* Constructors and Destructors
*****************************************************************/
List() { size = 0; first = nullptr; };
/* Constructor with input - for memory preallocation */
List(Element<N>* mem_destination){ size = 0; first = mem_destination; };
List(const List<N>& other): first(other.first), size(other.size) {};
~List(){ delete_list(); }
void delete_list()
{
Element<N>* iter;
size = 0;
while(first != nullptr)
{
iter = first->next;
delete first;
first = iter;
}
if(iter != nullptr)
{
delete iter;
iter = nullptr;
}
if(first != nullptr)
{
delete first;
first = nullptr;
}
}
friend std::ostream& operator<< (std::ostream& os, const List lista){
Element<N>* iter = lista.first;
os << "size: " << lista.size << std::endl;
while(iter != NULL){
os << iter->element << std::endl;
iter = iter->next;
}
if(iter != nullptr)
iter = nullptr;
return os;
}
...
代码太多,这有效
void delete_list()
{
size = 0;
while (first != nullptr)
{
Element<N>* next = first->next;
delete first;
first = next;
}
}
您的版本在第一个循环中是可以的,但是由于某种原因,您决定必须删除iter
即使它只是一个工作变量,而不是列表的一部分,然后您决定再次删除first
。我不知道你为什么觉得有必要这样做。
顺便说一句,这是一个严重的错误
List(const List<N>& other): first(other.first), size(other.size) {}
复制列表时,需要分配一组新的节点,否则最终会有两个列表共享同一组节点,并且无法判断何时可以安全删除节点。您可能需要阅读三法则。