我是否应该在 class 的析构函数(在 C++ 中)中删除指向 int 的指针?

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

我真的很难理解指针,所以如果这个问题可能有任何歧义,请原谅我。是的,我问的不止一个问题,不过标题中的问题是迄今为止最重要的。其他问题只是我非常感谢你回答的问题。所以假设我有一个 class 看起来像这样:

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

现在,据我所知,人们会为 class 和结构调用构造函数,并为每个构造函数调用解构函数。有人告诉我在解构函数中不应该删除整数,但是删除指向整数的指针呢?不应该像这样在解构函数中删除它:

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

如果不是,为什么?

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

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

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

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

The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.


事实上,关于编写好的 C++ 代码,您甚至不应该 delete 自己指针,而只需使用 std::unique_ptr 并让默认析构函数处理它。

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

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