首页 > 解决方案 > 什么时候需要删除指针,什么时候需要将它们设置为 0?

问题描述

我是一名学习 C++ 的 CS 学生。

这是一个普遍的问题,但我正在使用的特定示例是创建一个链表,该链表将具有存储字符串指针的节点。

class LinkNode {
public:
    friend class Stack;
    LinkNode* next;
    std::string* data;
    LinkNode(std::string* data, LinkNode* next) :data(data), next(next) { ; }
}

如果我使用指针,那么我不应该有一个delete同时调用nextand的析构函数data吗?

~LinkNode() {
    delete this->data;
    delete this->next;
}

我的教材中使用的代码以及互联网上的示例都忽略了包含这一点(即使我们确实在其他上下文中使用了析构函数)。我试图理解为什么在这种情况下不需要这样做。

而且,非常相关:如果我使用指针来删除某些东西,我是否必须将指针设置为空?

我经常看到人们这样写删除:

delete ptr;
ptr = 0;

据我了解,将其设置为 0 的目的只是为了防止它被意外使用,因为delete它现在指向无效的内存地址。

因此,如果我delete在函数末尾调用指针将超出范围的函数,例如在弹出函数或析构函数中,我可以省略该行吗?人们只是出于习惯而包含它吗?

标签: c++pointers

解决方案


  • delete指向有效对象/变量的指针以销毁它们并释放空间。
  • 将它们设置为NULL,nullptr0(完全相同),以便您可以将它们标识为未使用。

你看,如果你只是delete对象,指针本身不会改变,所以现在它指向一个无效的内存空间。如果您再也不会使用该指针,那么这没什么大不了的,否则可能会成问题。

因此,将其设置为null允许您对指针执行检查并确定您的指针是否正在使用。


此外,要回答您的第一个问题,正如评论中指出的那样,您必须调用delete您使用创建的指针new

  • 因此,假设data您的示例的指针指向在列表之外创建的字符串(因此它的行为类似于引用列表)。在这种情况下,该指针不负责管理其内容并且不应被删除。
  • 但是,例如,如果每次添加新节点时都添加了新节点,data = new string("whatever");那么是的,您应该在析构函数中删除它们。

推荐阅读