我真的很难理解指针,所以请原谅我这个问题可能带来的任何歧义。是的,我问了不止一个问题,但标题中的问题是迄今为止最重要的问题。其他问题只是我非常感谢您回答的问题。所以我可以说我有一个看起来像这样的类:
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 ++。
答案 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
动态)时,将分配其所有成员;当你释放它时,它的所有记忆都将被回收。您无需删除单个成员。