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

C++ c++;通过指向派生对象基类的指针删除派生对象,c++,memory,dynamic,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上的所有内存都将可用?? 这些类中没有任何动态分配的数据。是的,由于虚拟析构函数,所有内存都将可用。a2的析构函数将调用a1的析构

在这种情况下:

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

class a2 : public a1 {
   public:
     int i2;
};
int main() {
   a1* aa2 = new a2; 
   delete aa2;
}
如果我删除aa2,那么a2上的所有内存都将可用??
这些类中没有任何动态分配的数据。

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

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


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

是,它将被完全删除。如果在类中有动态分配的内存,那么也必须删除它。当然,这是用任何资源来学习C++的。我相信OP的关注是由一个单独的C++魔法解决的。是delete函数将释放内存。:)对,神奇的是找到正确的指针传递给deallocation函数。这是
动态\u cast(p)
的效果,但通常是优化的。它是根据被调用的析构函数的类进行搜索的。因此,如果sizeof(a2)是20,那么所有20个字节都将是空闲的,对吗?