删除指针而不是变量
Deleting pointer Instead of variable
据我了解,当你在堆上分配对象时,你使用
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 的块时,分配器会在链表中搜索满足请求的块。当分配器找到块时,它会返回指向所述块的指针,即块中第一个字节的地址。
释放内存只是将块返回到链表中,以便当您尝试再次分配内存时,可以重用该块。
分配器需要知道的只是第一个字节的地址和大小。这就是为什么它只处理指针。
- 将地址分配给本地指针后,公共对象的变量将消失
- 如果非动态变量被指针引用,何时超出范围?
- 在函数结束后使用指向变量的指针是否安全?
- 有没有将变量名称转换为双指针的简短方法?
- 成员变量指针的函数参数包
- C++ - 使用变量指针调用函数
- 如何返回值为NULL的变量指针
- 在编译时以增量方式构建变量指针的向量
- C 取消实例变量指针
- 每个方法调用上都覆盖了本地变量指针
- 决定对基类的变量指针进行函数调用
- 使用 valgrind 时获得 int 变量指针的无效读取大小错误
- 变量指针的成员函数未绘制到SDL_Surface?
- 何时使用成员变量指针
- 从成员变量指针返回布尔值
- 指向C#和C++之间接口的变量指针
- c++中指向self的成员变量指针
- 为什么变量指针包含相同数据类型的地址?
- 指向用户定义类型的类的全局变量指针
- C++分配一个变量指针地址