考虑以下代码
class Ref
{
public:
virtual ~Ref()
{
cout << "~Ref()" << endl;
}
};
class People :public Ref
{
public:
~People()
{
cout << "~People()" << endl;
}
};
- class Ref
- {
- public:
- virtual ~Ref()
- {
- cout << "~Ref()" << endl;
- }
- };
- class People :public Ref
- {
- public:
- ~People()
- {
- cout << "~People()" << endl;
- }
- };
class Ref
{
public:
virtual ~Ref()
{
cout << "~Ref()" << endl;
}
};
class People :public Ref
{
public:
~People()
{
cout << "~People()" << endl;
}
};
以下代码输出什么?
int main(int argc, char *argv[])
{
{
People hk;
}
system("pause");
return 0;
}
没错,先析构子类,然后父类,这时候基类析构函数~Ref 有无virtual 都没关系
- int main(int argc, char *argv[])
- {
- {
- People hk;
- }
- system("pause");
- return 0;
- }
- 没错,先析构子类,然后父类,这时候基类析构函数~Ref 有无virtual 都没关系
int main(int argc, char *argv[])
{
{
People hk;
}
system("pause");
return 0;
}
没错,先析构子类,然后父类,这时候基类析构函数~Ref 有无virtual 都没关系
考虑以下代码输出什么
int main(int argc, char *argv[])
{
Ref *hk=new People;
delete hk;
system("pause");
return 0;
}
这个也没问题,多态嘛,子类部分 和 基类部分 都能正确析构 。
如果此时 基类析构函数没有virtual关键字,那么问题来了,由于hk是指向Ref的指针,所以delete操作时,
只是析构了 基类Ref ,而子类部分 没有被delete 后果就是导致内存泄露,子类部分没有被析构 这个很容易验证。
也就是为什么上篇文章的Ref类 release中的 delete this为什么能够 删除子类和基类,因为对于ref类来说
this也就是上面代码的 hk, 虽然看起来没有 Ref *hk=new People; 这个直观看出来是多态,但是基类this指向的有效地址
其实还是new People 只不过这个被赋予了基类 this和子类this
.
- int main(int argc, char *argv[])
- {
-
- Ref *hk=new People;
-
- delete hk;
- system("pause");
- return 0;
- }
- 这个也没问题,多态嘛,子类部分 和 基类部分 都能正确析构 。
- 如果此时 基类析构函数没有virtual关键字,那么问题来了,由于hk是指向Ref的指针,所以delete操作时,
- 只是析构了 基类Ref ,而子类部分 没有被delete 后果就是导致内存泄露,子类部分没有被析构 这个很容易验证。
- 也就是为什么上篇文章的Ref类 release中的 delete this为什么能够 删除子类和基类,因为对于ref类来说
- this也就是上面代码的 hk, 虽然看起来没有 Ref *hk=new People; 这个直观看出来是多态,但是基类this指向的有效地址
- 其实还是new People 只不过这个被赋予了基类 this和子类this
- .
int main(int argc, char *argv[])
{
Ref *hk=new People;
delete hk;
system("pause");
return 0;
}
这个也没问题,多态嘛,子类部分 和 基类部分 都能正确析构 。
如果此时 基类析构函数没有virtual关键字,那么问题来了,由于hk是指向Ref的指针,所以delete操作时,
只是析构了 基类Ref ,而子类部分 没有被delete 后果就是导致内存泄露,子类部分没有被析构 这个很容易验证。
也就是为什么上篇文章的Ref类 release中的 delete this为什么能够 删除子类和基类,因为对于ref类来说
this也就是上面代码的 hk, 虽然看起来没有 Ref *hk=new People; 这个直观看出来是多态,但是基类this指向的有效地址
其实还是new People 只不过这个被赋予了基类 this和子类this
.
所以一般情况下来说 析构函数尽量使用virtual 关键字,虽然虚函数表有额外系统开支,但是对于避免内存泄露 特别是需要内存自动管理的时候,
优点显而易见了