【问题标题】:Deleting pointer Instead of variable删除指针而不是变量
【发布时间】:2016-02-04 00:06:40
【问题描述】:

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

Object* dynamicobject = new Object();

当我调用 delete 我去

delete dynamicobject

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

【问题讨论】:

  • delete 运算符取消引用指针以找到要回收的内存。
  • 请注意new Object();new Object;是不同的
  • 为了删除内存中的实际对象,你需要知道对象在哪里。换句话说,你需要一个指向它的指针。
  • 如果你想销毁对象本身而不归还内存,你会这样做dynamicobject->~dynamicobject()
  • @EdHeal 两者有何不同?

标签: c++ dynamic-memory-allocation


【解决方案1】:

如果你这样做了

delete *dynamicobject;

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

例如,假设你这样做:

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

如果你这样做了:

delete *dynamic_int;

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

delete dynamic_int;

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      所以delete需要被赋予指向要释放的内存的指针。

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

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

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

      所以delete 需要指针,该指针被解除引用以破坏对象本身,然后用于确定要释放的确切内存

      【讨论】:

        【解决方案4】:

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

        您不必(也不能)写delete *dynamicobject;,大概与您不必写dynamicobject = &new Object;的原因类似。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-03-31
            • 2015-08-09
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-24
            • 2012-08-12
            相关资源
            最近更新 更多