博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
析构函数何时被调用
阅读量:2382 次
发布时间:2019-05-10

本文共 2401 字,大约阅读时间需要 8 分钟。

析构函数何时被调用

析构函数在下边3种情况时被调用:

  1. 对象生命周期结束,被销毁时;
  2. 主动调用delete ;
  3. 对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

第一种情况

#include 
using namespace std;class A{public: A() { cout << "constructing A" << endl; } ~A() { cout << "destructing A" << endl; }private: int a;};void main(){ A a;}

运行结果:

constructing Adestructing A

第二种情况

如果是new的对象,即使离开了作用域也会一直存在,必须主动delete,否则只有在结束程序时才会执行析构。这里在说下内存泄漏,举个例子

#include 
using namespace std;class A{public: A() { cout << "constructing A" << endl; } ~A() { cout << "destructing A" << endl; }private: int a;};void fun() { A *a = new A();}int main() { while (1) { fun(); } return 0;}

当离开fun时,虽然离开了作用域,但用new动态开辟空间的对象是不会析构的,你可以观察任务管理器,看到内存一直在上升。但你在其他地方确无法使用a所开辟的空间,因为a这个指针是保存在栈上的,当离开作用域后就自动析构(或者说自动消失了),但它所在分配空间是分配在堆上的,只有主动析构或程序结束,才会释放空间,也就是丢失了这块空间的地址,无法操作这块空间了 。

第三种情况

#include 
using namespace std;class A{public: A() { cout << "constructing A" << endl; } ~A() { cout << "destructing A" << endl; }private: int a;};class C{public: C() { cout << "constructing C" << endl; } ~C() { cout << "destructing C" << endl; }private: int c;};class B : public A{public: B() { cout << "constructing B" << endl; } ~B() { cout << "destructing B" << endl; }private: int b; C c;};void main(){ B b;}

运行结果:

constructing Aconstructing Cconstructing Bdestructing Bdestructing Cdestructing A

B的析构函数调用之后,又调用了B的成员c的析构函数 。

若将上边的代码中的main()函数内容改成

A* a = new B; delete a;

我们知道,这将不会调用class B的析构函数不会被调用,所以class C的析构函数也不会被调用。

运行结果:

constructing Aconstructing Cconstructing Bdestructing A

若将class A中的析构函数声明为虚函数 ,这时class B的析构函数也会被调用,例如:

#include 
using namespace std;class A{public: A() { cout << "constructing A" << endl; } virtual ~A() { cout << "destructing A" << endl; }private: int a;};class C{public: C() { cout << "constructing C" << endl; } ~C() { cout << "destructing C" << endl; }private: int c;};class B : public A{public: B() { cout << "constructing B" << endl; } ~B() { cout << "destructing B" << endl; }private: int b; C c;};void main(){ A* a = new B; delete a;}

运行结果:

constructing Aconstructing Cconstructing Bdestructing Bdestructing Cdestructing A

此文章参考了:

转载地址:http://diwab.baihongyu.com/

你可能感兴趣的文章
Redis数据库篇 -- 生存时间
查看>>
面向对象设计基本原则
查看>>
Redis数据库篇 -- 事务
查看>>
hadoop 完全分布式环境搭建
查看>>
HDFS 回收站
查看>>
hadoop 完全分布式HA高可用集群(手工切换)搭建
查看>>
hadoop 完全分布式HA高可用集群(自动切换)搭建
查看>>
Hbase shell常见命令
查看>>
看看这同一句sql,scan index占用的资源大了很多!!
查看>>
couldn't set locale correctly报错解决
查看>>
回收基表的空间,造成物化视图只刷新了一部分数据
查看>>
ORA-12052,不能建立快速刷新物化视图的解决
查看>>
物化视图comlete刷新会产生大量的日志
查看>>
Mysql cluster slave server的自动检测与修复
查看>>
solaris同步时钟
查看>>
mysql升级
查看>>
linux和solaris下的时间计算
查看>>
crontab不执行mysql的脚本问题的解决!
查看>>
linux as 5 下的raw的处理
查看>>
shell 里printf的用法
查看>>