我应该删除类解构器中 int 的指针(在 C++ 中)吗?

Should I delete a pointer to an int in a class's deconstructor (in C++)?

本文关键字:C++ 指针 int 删除 我应该      更新时间:2023-10-16

我真的很难理解指针,所以请原谅我这个问题可能存在的任何歧义。是的,我问了不止一个问题,但标题中的问题是目前为止最重要的。其他的问题我希望你能回答。假设我有一个类,它看起来像这样:

class myclass
{
public:
    myclass();
    ~myclass();
private:
    struct node
    {
        node * next;
    }
    node * head;
    int myint;
}

现在,正如我所知,一个人会调用类和结构的构造函数,以及解构函数。有人告诉我,不应该在解构函数中删除整数,但是如何删除指向整数的指针呢?不应该像这样在解构器中删除它吗:

myclass::~myclass
{
    delete head;
    delete &myint;
}

如果没有,为什么?

如果你只想回答这个问题,就不要往下读了。为了简洁起见,我的下一个问题是关于这段代码,以及上面的解构函数,我被告知它是错误的(假设它与上面的解构函数是同一文件的一部分):

myclass::node::~node
{
    delete next;
}

更具体地说,我被告知不应该删除节点,除非它们已经用new标记声明。不用说,我觉得这很令人困惑。如果可以,你能解释一下他们的意思吗?为什么他们说的是真的?如果能给我一个解释的链接,我也会很感激的,请理解我是一个编码新手,我几个月前才开始学习c++。

您只能在使用new动态分配的内存上使用delete

在您的示例中,myint不是一个单独的动态分配内存块。它是myclass对象的成员,它的内存不能与包含它的对象分开管理。当你分配一个myclass对象时(无论是作为普通变量,还是动态地使用new myclass),它的所有成员都将被分配;当您释放它时,它的所有内存将被回收。您不需要删除单个成员

不,您应该只在通过new分配的内存指针上使用delete,根据c++标准§5.3.5/1:

delete-expression操作符可销毁由new-expression创建的最派生对象(1.8)或数组。


事实上,要写出好的c++代码,你甚至不应该自己delete那个指针,而应该使用一个std::unique_ptr,让默认析构函数来处理它。