您的位置:首页 > 其它

new和delete 基类指针指向继承类的对象时,delete的过程

2016-05-21 15:55 363 查看
#include<iostream>

using namespace std;



class A{

public:

A(){cout<<"A被构造\n";}

~A(){cout<<"A被析构\n";}

};

class B:public A

{

public:

B(){cout<<"B被构造\n";}

~B(){cout<<"B被析构\n";}

};

int main()

{

A *p=new B;

delete p;

}


运行结果:

A被构造

B被构造

A被析构

Process returned 0 (0x0) execution time : 0.973 s

Press any key to continue.

关键不在于释放内存,而在于析构对象。

C++ new /delete 除了分配内存外,还自动调用构造函数/析构函数

new 分配内存后,调用构在函数,构造对象

delete 释放内存后,调用析构函数,析构对象。

当然,如果派生类有指针成员,并在构造函数中分配内存,析构函数中释放内存。

那么,如果父类没有把析构函数声明为虚析构函数,

delete 的时候,由于指针类型是父类,对象类型是子类,

那么只调用了父类的析构函数;析构了,子类中的父类子对象(父类部分);

子类的析构函数没有机会调用,子类部分则没有析构。

由于子类部分没有析构,指针成员分配的内存就不会释放。

这样就会造成内存泄露。

如果是子类部分配了其他资源,并在析构函数中释放,则会造成资源泄露。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: