开释指向堆内派生类对象的基类指针,对象中原来在派生类中定义的变量的内存空间释放了吗
释放指向堆内派生类对象的基类指针,对象中原来在派生类中定义的变量的内存空间释放了吗?
class A
{
int a;
};
class B : public A
{
int b;
};
void main()
{
A *p = new B;
delete p;
}
如此,对象中变量b所占的内存空间释放了吗?
------解决方案--------------------
忘记标准怎么说了,只是记得“条款”建议A的destructor需要是virtual的。
------解决方案--------------------
我也记得是这样的吧,
------解决方案--------------------
Effective C++的确是这么说的,“为多态基类声明virtual析构函数”
作者解释的是:当子类对象经由一个基类指针被删除,而该基类的虚构函数不是virtual,那么结果未定义,实际执行时通常发生的是对象的子类部分没有被销毁,
最后的结果通常是基类部分被销毁了,而子类却没有的奇怪现象
primer好像也提到过
------解决方案--------------------
关键不在于释放内存,而在于析构对象。
C++ new /delete 除了分配内存外,还自动调用构在函数/析构函数
new 分配内存后,调用构在函数,构造对象
delete 释放内存后,调用析构函数,析构对象。
当然,如果派生类有指针成员,并在构造函数中分配内存,析构函数中释放内存。
那么,如果父类没有把析构函数声明为虚析构函数,
delete 的时候,由于指针类型是父类,对象类型是子类,
那么只调用了父类的析构函数;析构了,子类中的父类子对象(父类部分);
子类的析构函数没有机会调用,子类部分则没有析构。
由于子类部分没有析构,指针成员分配的内存就不会释放。
这样就会造成内存泄露。
如果是子类部分配了其他资源,并在析构函数中释放,则会造成资源泄露。
------解决方案--------------------
new 分配内存后,调用构在函数,构造对象
delete ,调用析构函数,析构对象后,释放内存。
class A
{
int a;
};
class B : public A
{
int b;
};
void main()
{
A *p = new B;
delete p;
}
如此,对象中变量b所占的内存空间释放了吗?
------解决方案--------------------
忘记标准怎么说了,只是记得“条款”建议A的destructor需要是virtual的。
------解决方案--------------------
我也记得是这样的吧,
------解决方案--------------------
Effective C++的确是这么说的,“为多态基类声明virtual析构函数”
作者解释的是:当子类对象经由一个基类指针被删除,而该基类的虚构函数不是virtual,那么结果未定义,实际执行时通常发生的是对象的子类部分没有被销毁,
最后的结果通常是基类部分被销毁了,而子类却没有的奇怪现象
primer好像也提到过
------解决方案--------------------
关键不在于释放内存,而在于析构对象。
C++ new /delete 除了分配内存外,还自动调用构在函数/析构函数
new 分配内存后,调用构在函数,构造对象
delete 释放内存后,调用析构函数,析构对象。
当然,如果派生类有指针成员,并在构造函数中分配内存,析构函数中释放内存。
那么,如果父类没有把析构函数声明为虚析构函数,
delete 的时候,由于指针类型是父类,对象类型是子类,
那么只调用了父类的析构函数;析构了,子类中的父类子对象(父类部分);
子类的析构函数没有机会调用,子类部分则没有析构。
由于子类部分没有析构,指针成员分配的内存就不会释放。
这样就会造成内存泄露。
如果是子类部分配了其他资源,并在析构函数中释放,则会造成资源泄露。
------解决方案--------------------
new 分配内存后,调用构在函数,构造对象
delete ,调用析构函数,析构对象后,释放内存。