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

时间:2015-09-26 00:14:56

标签: c++ pointers delete-operator

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

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 ++。

2 个答案:

答案 0 :(得分:1)

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

  

delete-expression运算符会销毁一个派生最多的对象(1.8)或由new-expression创建的数组。

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

答案 1 :(得分:1)

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

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