C ++双向链表:如何显示Destructor是否正确实现

时间:2018-05-05 22:39:14

标签: c++ destructor

基本上,我创建了一个双向链表,现在需要显示析构函数是在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

2 个答案:

答案 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;
    }