我应该删除类解构器中 int 的指针(在 C++ 中)吗?
Should I delete a pointer to an int in a class's deconstructor (in C++)?
我真的很难理解指针,所以请原谅我这个问题可能存在的任何歧义。是的,我问了不止一个问题,但标题中的问题是目前为止最重要的。其他的问题我希望你能回答。假设我有一个类,它看起来像这样:
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
,让默认析构函数来处理它。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错