c ++通过指向其基类的指针删除派生对象

时间:2014-02-02 23:06:21

标签: c++ memory dynamic

在这种情况下:

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

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

如果我删除aa2那么在a2上分配的所有内存都是免费的? 这些类内部没有动态分配的数据。

1 个答案:

答案 0 :(得分:0)

是的,由于虚拟析构函数,所有内存都是免费的。 a2的析构函数将调用a1的析构函数。

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

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