删除指针而不是变量

Deleting pointer Instead of variable

据我了解,当您在堆上分配对象时,您会使用

Object* dynamicobject = new Object();

当我调用 delete 我去

delete dynamicobject

我很困惑,因为我删除了指向该对象实例的指针,但按照我的思路,您实际上需要删除内存本身中的对象,这需要您取消引用指针,例如 删除*动态对象 但这是不正确的。 如果要改变指针指向的对象,需要对其进行解引用,我假设同样申请删除,但好像只能删除指针。

运算符是并行的。 new returns 指向新分配内存的指针。 delete 获取指向已分配内存的指针并将其删除。换句话说,delete (new ...()) 有效。

考虑到 delete 从根本上必须以某种方式处理内存,而不是对象本身,这可能会有所帮助。因此它不仅需要对象,还需要对象的内存位置。

delete dynamicobject;不删除指针dynamicobject。相反,它会删除 dynamicobject 指向的对象。

您不必(也不能)写 delete *dynamicobject;,大概是出于与您不必写 dynamicobject = &new Object;.

类似的原因

如果你这样做

delete *dynamicobject;

delete 运算符的值是动态内存位置中的值,而不是位置本身。 delete 运算符需要知道动态内存在哪里,以便回收它。

例如,假设您这样做:

int *dynamic_int = new int;
*dynamic_int = 10;

如果你这样做了:

delete *dynamic_int;

delete 运算符将收到整数值 10。这不提供回收存储该值的动态内存所需的信息。但如果你这样做

delete dynamic_int;

delete 运算符接收该动态内存的地址,并且可以回收它。

你只处理指针,因为动态内存分配只是一个大的块链表。当您请求大小为 n 的块时,分配器会在链表中搜索满足请求的块。当分配器找到块时,它 returns 一个指向所述块的指针——即块中第一个字节的地址。

简单地释放内存 returns 将块放入链表中,这样当您尝试再次分配内存时,该块可能会被重新使用。

分配器只需要知道第一个字节的地址和大小。这就是为什么它只处理指针。

我认为您正在考虑销毁 对象。当您调用 new 时,会为该对象分配内存,并将其地址作为 指针 返回。 指针是一个唯一的标识符,准确记录当对象被删除[=38=时需要释放的内存区域].

所以delete需要给出指向要释放的内存的指针。

但这并没有杀死对象。通过 运行 析构函数杀死对象,这就是取消引用指针的地方。

析构函数当然是~Object() {}.

因此 delete 将通过 析构函数 [=38] 取消引用 指针 以访问对象的实际内存=] 功能。 析构函数在解引用对象上运行后,对象占用的内存地址被释放回运行时间系统。

所以delete需要指针,它被取消引用以破坏对象本身,然后用于确定内存 发布。