删除指针而不是变量

Deleting pointer Instead of variable

本文关键字:变量 指针 删除      更新时间:2023-10-16

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

Object* dynamicobject = new Object();

当我打电话删除我去

delete dynamicobject

我很困惑,因为我删除了指向该对象实例的指针,但是按照我的思路,您需要实际删除内存本身中的对象,这需要您取消引用指针,例如 删除 *动态对象但这是不正确的。如果要更改指针指向的对象,则需要取消引用,我假设同样适用于删除,但似乎只能删除指针。

如果你这样做

delete *dynamicobject;

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

例如,假设您执行以下操作:

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

如果你当时做了:

delete *dynamic_int;

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

delete dynamic_int;

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

运算符

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

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

我认为您正在考虑破坏对象。调用 new 时,将为对象分配内存,其地址作为指针返回。该指针是一个唯一标识符,准确记录在删除对象时需要释放哪个内存区域。

因此,需要为delete提供指向内存的指针以进行解除分配。

但这并不能杀死物体。通过运行析构函数来终止对象,这是取消引用指针的地方。

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

因此delete将通过运行析构函数来取消引用指针以访问对象的实际内存。析构函数在取消引用的对象上运行后,该对象占用的内存地址将释放回运行时系统。

因此delete需要取消引用的指针来破坏对象本身,然后用于确定要释放的内存

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

你不必(也不能(写delete *dynamicobject;,大概是出于与为什么你不必写dynamicobject = &new Object;类似的原因。

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

释放内存只是将块返回到链表中,以便当您尝试再次分配内存时,可以重用该块。

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