首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

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

class B : public A
{
int b;
};

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

如此,对象中变量b所占的内存空间释放了吗?
[解决办法]
Effective C++的确是这么说的,“为多态基类声明virtual析构函数”
作者解释的是:当子类对象经由一个基类指针被删除,而该基类的虚构函数不是virtual,那么结果未定义,实际执行时通常发生的是对象的子类部分没有被销毁,
最后的结果通常是基类部分被销毁了,而子类却没有的奇怪现象
primer好像也提到过

[解决办法]
关键不在于释放内存,而在于析构对象。

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


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





[解决办法]
new 分配内存后,调用构在函数,构造对象
delete ,调用析构函数,析构对象后,释放内存。

热点排行