C++虚析构函数
2011-12-24 16:58
218 查看
当释放类对象指针时,会调用类析构函数,但如果释放的基类指针是属于其派生类对象的,
这种行为未定义,为了保证派生类的析构函数也被调用,需要将基类析构函数定义为虚。
例子:
//1. 基类使用虚析构函数 (基类为A)
#include <iostream>
using namespace std;
class C {
public:
C() {
cout << "C::C()" << endl;
}
~C() {
cout << "C::~C()" << endl;
}
};
class D {
public:
D() {
cout << "D::D()" << endl;
}
~D() {
cout << "D::~D()" << endl;
}
};
class A {
private:
C *pc;
public:
A() {
cout << "A::A()" << endl;
pc = new C;
}
virtual ~A() {
cout << "A::~A()" << endl;
delete pc;
}
};
class B : public A {
private:
D *pd;
public:
B() {
cout << "B::B()" << endl;
pd = new D;
}
~B() {
cout << "B::~B()" << endl;
delete pd;
}
};
int main()
{
B *pb = new B;
A *pa = pb;
delete pa;
return 0;
}
运行结果:
A::A()
C::C()
B::B()
D::D()
B::~B()
D::~D()
A::~A()
C::~C()
没有内存泄露
// 2. 基类使用虚析构函数 (基类为A)
#include <iostream>
using namespace std;
class C {
public:
C() {
cout << "C::C()" << endl;
}
~C() {
cout << "C::~C()" << endl;
}
};
class D {
public:
D() {
cout << "D::D()" << endl;
}
~D() {
cout << "D::~D()" << endl;
}
};
class A {
private:
C *pc;
public:
A() {
cout << "A::A()" << endl;
pc = new C;
}
~A() {
cout << "A::~A()" << endl;
delete pc;
}
};
class B : public A {
private:
D *pd;
public:
B() {
cout << "B::B()" << endl;
pd = new D;
}
~B() {
cout << "B::~B()" << endl;
delete pd;
}
};
int main()
{
B *pb = new B;
A *pa = pb;
delete pa;
return 0;
}
运行结果:
A::A()
C::C()
B::B()
D::D()
A::~A()
C::~C()
存在内存泄露,B::D *pd 没有被释放
这种行为未定义,为了保证派生类的析构函数也被调用,需要将基类析构函数定义为虚。
例子:
//1. 基类使用虚析构函数 (基类为A)
#include <iostream>
using namespace std;
class C {
public:
C() {
cout << "C::C()" << endl;
}
~C() {
cout << "C::~C()" << endl;
}
};
class D {
public:
D() {
cout << "D::D()" << endl;
}
~D() {
cout << "D::~D()" << endl;
}
};
class A {
private:
C *pc;
public:
A() {
cout << "A::A()" << endl;
pc = new C;
}
virtual ~A() {
cout << "A::~A()" << endl;
delete pc;
}
};
class B : public A {
private:
D *pd;
public:
B() {
cout << "B::B()" << endl;
pd = new D;
}
~B() {
cout << "B::~B()" << endl;
delete pd;
}
};
int main()
{
B *pb = new B;
A *pa = pb;
delete pa;
return 0;
}
运行结果:
A::A()
C::C()
B::B()
D::D()
B::~B()
D::~D()
A::~A()
C::~C()
没有内存泄露
// 2. 基类使用虚析构函数 (基类为A)
#include <iostream>
using namespace std;
class C {
public:
C() {
cout << "C::C()" << endl;
}
~C() {
cout << "C::~C()" << endl;
}
};
class D {
public:
D() {
cout << "D::D()" << endl;
}
~D() {
cout << "D::~D()" << endl;
}
};
class A {
private:
C *pc;
public:
A() {
cout << "A::A()" << endl;
pc = new C;
}
~A() {
cout << "A::~A()" << endl;
delete pc;
}
};
class B : public A {
private:
D *pd;
public:
B() {
cout << "B::B()" << endl;
pd = new D;
}
~B() {
cout << "B::~B()" << endl;
delete pd;
}
};
int main()
{
B *pb = new B;
A *pa = pb;
delete pa;
return 0;
}
运行结果:
A::A()
C::C()
B::B()
D::D()
A::~A()
C::~C()
存在内存泄露,B::D *pd 没有被释放
相关文章推荐
- C++析构函数和虚析构函数。
- C++虚析构函数 http://c.biancheng.net/cpp/biancheng/view/247.html
- C++ 析构函数&虚析构函数
- C++之虚析构函数
- <C++>析构函数、虚析构函数和构造函数
- C++继承中构造函数、析构函数调用顺序及虚析构函数
- C++虚析构函数、纯虚析构函数
- C++中的虚析构函数
- C++ 虚析构函数
- C++ 虚析构函数 分析
- C++虚析构函数的使用(可能造成内存泄露问题)
- C++虚析构函数与纯虚析构函数
- C++虚析构函数
- C++虚析构函数
- C++浅析——继承类内存分布和虚析构函数
- c++ 虚析构函数
- C++虚析构函数使用场景
- C++易混点——深度解析指针悬挂和虚析构函数
- C++中的为什么需要虚析构函数
- C++虚析构函数的作用