删除指针而不是变量

时间:2016-02-04 00:06:41

标签: c++ dynamic-memory-allocation

根据我的理解,当您在堆上分配对象时,使用

Object* dynamicobject = new Object();

当我打电话给删除时,我去

delete dynamicobject

我很困惑,因为我删除了指向该对象实例的指针,但沿着我的思路,你需要实际删除内存中的对象,这需要你取消引用指针     删除* dynamicobject 但这是不正确的。 如果你想更改指针所指向的对象,则需要取消引用它,并且我假设同样适用于删除,但似乎只能删除指针。

5 个答案:

答案 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