在调用析构函数时,是否可以将指向类实例的指针设置为nullptr?

时间:2016-05-23 02:49:19

标签: c++ pointers memory-management linked-list nullptr

我正在尝试为类项目创建链接列表。我的节点类有一个指向链接节点的指针和另一个指向专门的书类的指针。

class Node{
private:
    Book *data;
    Node *linkedLink;
public:
    Node(Book *inputedData);
    Book* getBook();
    Node* getLinked();
    void changeLinked(Node *newLink);
    Node& operator=( const Node& rhs );

    ~Node(); //deconstructor
};

我的教授提供了一个我们无法更改的驱动程序。在这个驱动程序中,他有以下代码:

// (bookList is an instance of my LinkedList class)
// (and getFirst() returns my LinkedList's head node)

while (bookList.getFirst() != nullptr)
{
    Node * t = partsList.pop_front();
    delete t;
}

以下是我的节点类析构函数:

Node::~Node(){
    delete data; //this deletes the book class that data points to.
    delete linkedLink;
}

问题是,我需要变量(t)指向Node类的实例在完成释放nullptr*data之后设置为*linkedLink。但我不能更改我的教授驱动程序,这意味着我必须在我的Node类析构函数中执行此操作。我对如何做到这一点感到难过......难道我不必将Node类设置为nullptr以突破我教授驱动程序的while循环吗?或者也许我完全偏离轨道并且过度思考这个问题。任何帮助将不胜感激。

======= [编辑] =======

我的Node类只能指向另一个Node类,不再需要。它必须是“单链接”列表,而不是“双重链接”。

======= [编辑2.0] ========

对于那些要求更多代码的人,以下是我的LinkedList类。

class List{
private:
    Node* head;
    Node* tail;
    int count;
public:
    List();
    List(Node firstLink);

    ~List(); //deconstructor

    Node* getFirst() const;
    Node* getLast() const;

    void push_back(Node *data);
    void push_front(Node *data);

    Node* pop_front();
    Node* pop_back();

    int getLength() const;
    List& operator=(const List& that);
};

1 个答案:

答案 0 :(得分:5)

当一个对象被破坏时,C ++语言中没有任何工具可以自动将某个指针设置为null。如果某个指针需要在某个地方设置为null,那么构造函数就是析构函数的责任。据推测,在某种程度上,您需要实现某种跟踪指向类实例的指针的工具,然后在析构函数中将这些指针设置为null。

话虽如此,我确信你误解了你的任务。当类实例被销毁时,我认为没有必要将任何指针设置为null。

在教授的不可变驱动程序中,对pop_front()方法的调用将完全从其链接列表中删除该节点,并将指针返回到已删除的节点。您pop_front()的实现将从列表中完全删除节点,相应地更新所有列表指针,指向列表中的其余元素。

此时,除了从pop_front()返回指针之外,不存在指向类实例的其他指针,然后该指针立即获得delete d。没有任何指向你的类实例的指针需要设置为null。

您教授的代码是std::list的经典实现,它管理完全相同的任务,而不需要std::list中任何类实例的析构函数担心将任何指针设置为null。