我是否应该在 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
)时,它的所有成员都将被分配;当你释放它时,它的所有内存都将被回收。您不需要删除个别成员。
我真的很难理解指针,所以如果这个问题可能有任何歧义,请原谅我。是的,我问的不止一个问题,不过标题中的问题是迄今为止最重要的。其他问题只是我非常感谢你回答的问题。所以假设我有一个 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
)时,它的所有成员都将被分配;当你释放它时,它的所有内存都将被回收。您不需要删除个别成员。