基本上,我创建了一个双向链表,现在需要显示析构函数是在main.cpp(int main)中实现和测试的。
在作业中建议我应该创建一个函数,以及放置一个cout语句,在它被删除之前输出每个节点的地址。我不确定我应该怎么做。
到目前为止,我已经创建了一个这样的函数:
void cList() {
DoublyLinkedList a
cout << "ex: 0 1 2 3" << endl;
for (unsigned i = 0; i < 4; i++) {
a.push_back(i);
}
cout << "Display in function: ";
a.display();
cout << endl;
//this shows the addresses of each node
cout << "delete addresses: " << endl;
for (it = del.begin(); it!=del.end(); ++it) {
cout << &it << endl;
}
}
据我所知,当列表超出范围时,将调用析构函数。我在~DoublyLinkedList中有一个cout语句,上面写着“析构函数叫”。当我这样做时,在显示地址后输出“析构函数被调用”语句。但是如何通过在删除地址之前显示地址来满足要求?谢谢。
示例输出:
delete addresses:
0x7ffeb484d300
0x7ffeb484d300
0x7ffeb484d300
0x7ffeb484d300
Destructor Called
答案 0 :(得分:3)
您的构造函数可以在创建对象时输出该对象:
Node::Node()
{
std::cout << "Creating node: " << this << std::endl;
}
然后你的析构函数可以在销毁时输出相反的
Node::~Node()
{
std::cout << "Destroying node: " << this << std::endl;
}
然后你不需要delete
主要内容。您只需要确保DoublyLinkedList
的析构函数通过并销毁所有Node
个对象。然后当DoublyLinkedList a
超出范围时,您将看到析构函数的输出。
答案 1 :(得分:0)
您可以将此部分放入析构函数中:
cout << "delete addresses: " << endl;
for (it = del.begin(); it!=del.end(); ++it) {
cout << &it << endl;
}
因此当函数结束时,将自动显示已删除节点的输出。
//This is assuming you aren't using any sentinel head/tail pointers.
~DoublyLinkedList() {
cout << "delete addresses: " << endl;
Node* nextNode = nullptr;
while(headPtr) {
nextNode = headPtr->next;
cout << headPtr << endl;
delete headPtr;
headPtr = nextNode;
}
cout << "Destructor Called" << endl;
}