根据我的理解,当您在堆上分配对象时,使用
Object* dynamicobject = new Object();
当我打电话给删除时,我去
delete dynamicobject
我很困惑,因为我删除了指向该对象实例的指针,但沿着我的思路,你需要实际删除内存中的对象,这需要你取消引用指针 删除* dynamicobject 但这是不正确的。 如果你想更改指针所指向的对象,则需要取消引用它,并且我假设同样适用于删除,但似乎只能删除指针。
答案 0 :(得分:3)
如果你这样做
delete *dynamicobject;
赋予delete
运算符的值是动态内存位置中的值,而不是位置本身。 delete
运算符需要知道动态内存的位置,因此可以回收它。
例如,假设你这样做:
int *dynamic_int = new int;
*dynamic_int = 10;
如果你那么:
delete *dynamic_int;
delete
运算符将收到整数值10
。这并不能提供回收存储该值的动态存储器所需的信息。但如果你这样做
delete dynamic_int;
delete
运算符接收该动态内存的地址,并且可以回收它。
答案 1 :(得分:2)
运营商是平行的。 new
返回指向新分配内存的指针。 delete
获取指向已分配内存的指针并将其删除。换句话说,delete (new ...())
有效。
也许有必要考虑delete
从根本上必须以某种方式使用内存,而不是使用对象本身。因此,它不仅需要对象,还需要对象的内存位置。
答案 2 :(得分:0)
delete dynamicobject;
不会删除指针dynamicobject
。相反,它会删除dynamicobject
指向的对象。
你不必(并且不能)写delete *dynamicobject;
,大概是出于类似的原因,为什么你不必写dynamicobject = &new Object;
。
答案 3 :(得分:0)
你只处理指针,因为动态内存分配只是一个很大的链接列表。当您请求大小为 n 的块时,分配器会在链接列表中搜索满足请求的块。当分配器找到块时,它返回一个指向所述块的指针 - 即块中第一个字节的地址。
释放内存只会将块返回到链表中,这样当您尝试再次分配内存时,可以重用该块。
所有分配器需要知道的是第一个字节的地址和大小。这就是为什么它只涉及指针。
答案 4 :(得分:0)
我认为您正在考虑破坏对象。当您调用new
时,将为该对象分配内存,并将其地址作为指针返回。 指针是一个唯一的标识符,可以准确记录当删除对象时需要释放哪个内存区域。
因此需要为delete
提供指向要释放的内存的指针。
但这并没有杀死这个对象。通过运行析构函数来杀死对象,这是指针被解除引用的地方。
析构函数函数当然是~Object() {}
。
因此delete
将取消引用指针以通过运行析构函数函数来访问对象的实际内存。 析构函数在取消引用的对象上运行后,对象占用的内存地址将被释放回运行时系统。
所以delete
需要指针,它被取消引用以破坏对象本身,然后用于确定要释放的 memory 。