【问题标题】:c++ Deleting a derived object via a pointer to its base classc ++通过指向其基类的指针删除派生对象
【发布时间】:2014-02-02 23:06:21
【问题描述】:

在这种情况下:

class a1 {
   public:
     virtual ~a1(){}  
     int i;
};

class a2 : public a1 {
   public:
     int i2;
};
int main() {
   a1* aa2 = new a2; 
   delete aa2;
}

如果我删除 aa2,那么分配在 a2 上的所有内存都将是空闲的?? 这些类内部没有任何动态分配的数据。

【问题讨论】:

  • 是的,它将被完全删除。如果你在类中有任何动态分配的内存,你也必须删除它。
  • 这肯定包含在您用来学习 C++ 的任何资源中。

标签: c++ memory dynamic


【解决方案1】:

是的,由于虚拟析构函数,所有内存都将被释放。 a2的析构函数会调用a1的析构函数。

第一个将被称为 a2 的析构函数,因为虚拟函数表将包含它的地址,因为分配了 a2 类型的对象。

更准确地说,delete 操作符首先会调用 a2 的析构函数,然后调用 delete 函数来释放内存。

【讨论】:

  • 析构函数不会释放内存。我相信 OP 的担忧可以通过一个单独的 C++ 魔法解决。
  • @Kerrek SB 你是对的。释放内存的是删除函数。:)
  • 对,神奇的是找到正确的指针传递给释放函数。是dynamic_cast<void>(p)的效果,不过通常是优化的。
  • 根据被调用析构函数的类查找。
  • 所以如果 sizeof(a2) 为 20,那么所有 20 个字节都是免费的,对吧?
猜你喜欢
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2014-06-16
  • 2013-03-04
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多