开释指向堆内派生类对象的基类指针,对象中原来在派生类中定义的变量的内存空间释放了吗

释放指向堆内派生类对象的基类指针,对象中原来在派生类中定义的变量的内存空间释放了吗?
class A
{
int a;
};

class B : public A
{
int b;
};

void main()
{
A *p = new B;
delete p;
}

如此,对象中变量b所占的内存空间释放了吗?

------解决方案--------------------
忘记标准怎么说了,只是记得“条款”建议A的destructor需要是virtual的。
------解决方案--------------------
引用:
忘记标准怎么说了,只是记得“条款”建议A的destructor需要是virtual的。


我也记得是这样的吧,开释指向堆内派生类对象的基类指针,对象中原来在派生类中定义的变量的内存空间释放了吗
------解决方案--------------------
Effective C++的确是这么说的,“为多态基类声明virtual析构函数”
作者解释的是:当子类对象经由一个基类指针被删除,而该基类的虚构函数不是virtual,那么结果未定义,实际执行时通常发生的是对象的子类部分没有被销毁,
最后的结果通常是基类部分被销毁了,而子类却没有的奇怪现象
primer好像也提到过

------解决方案--------------------
关键不在于释放内存,而在于析构对象。

C++ new /delete 除了分配内存外,还自动调用构在函数/析构函数
new 分配内存后,调用构在函数,构造对象
delete 释放内存后,调用析构函数,析构对象。


当然,如果派生类有指针成员,并在构造函数中分配内存,析构函数中释放内存。
那么,如果父类没有把析构函数声明为虚析构函数,
delete 的时候,由于指针类型是父类,对象类型是子类,
那么只调用了父类的析构函数;析构了,子类中的父类子对象(父类部分);
子类的析构函数没有机会调用,子类部分则没有析构。
由于子类部分没有析构,指针成员分配的内存就不会释放。
这样就会造成内存泄露。
如果是子类部分配了其他资源,并在析构函数中释放,则会造成资源泄露。





------解决方案--------------------
new 分配内存后,调用构在函数,构造对象
delete ,调用析构函数,析构对象后,释放内存。