析构函数有2种方式调用,一个是主动调用delete,另一个是根据RAII的规则,在对象的生命周期结束时自动析构。第一点没什么好说的,就简单讲下第二点。

对象的生命周期不等于是程序的生命周期,一般我们所谓的生命周期就是一个作用域,当变量或者对象离开这个作用域时就会自动析构。一般一对{  } 就是一个作用域,举个例子

int main()
{
for(int i=0;i<10;i++){A a;
}
a//错误,脱离作用域
}

for结束后,就无法使用a了,因为该对象的生命周期已结束。

一般在函数里的对象,离开函数时才算离开作用域,即return发生时,才执行析构,所以main中定义的对象不是在你说的return 0;之前执行的。return是一个离开的标志,只有遇到了该标志,才会开始离开。

全局对象的话,是在程序结束时才执行析构,即遇到main中的return时,任何程序都是从main开始,到main结束的。

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

void fun(){A *a = new A();
}
int main(){while(1){fun();}reutn0;
}

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

类对象的析构函数大多用于释放类对象所包含的堆内存,因为堆内存不同于栈,是不会被自动销毁的。

可参考:

析构函数何时被调用_线上幽灵-CSDN博客_析构函数什么时候调用

关于C++析构函数什么时候执行的问题相关推荐

  1. 一文读懂C#中的抽象类、抽象方法、virtual虚函数、override重写函数及父类子类构造函数和析构函数的执行顺序

    // 父类 class People {public People(){Console.WriteLine("执行People构造函数!");}public virtual voi ...

  2. C++: 构造函数和析构函数

    一.构造函数: 1.引入构造函数的目的:对象的初始化(类数据成员的初始化) 2.带参数的构造函数 3.用参数初始化列表对数据成员初始化 4.构造函数的重载(重载:函数同名,但参数的个数或类型不一样)/ ...

  3. 虚函数、纯虚函数、虚函数与析构函数

    一.虚函数 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个 ...

  4. 构造函数不可以声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数.  不建议在构造函数和析构函数里调用虚函数. 构造函数不能声明为虚函数的原因? 构造一个对象时,必须知道对象 ...

  5. 27.能否在构造函数中抛出异常?析构函数呢?

    首先,我们要明确一点!一个函数执行的过程中,如果抛出异常,会导致函数提前终止! 在C++构造函数中,既需要分配内存,又需要抛出异常时要特别注意防止内存泄露的情况发生.因为在构造函数中抛出异常,在概念上 ...

  6. C++ 虚拟析构函数

    转自:http://see.xidian.edu.cn/cpp/biancheng/view/247.html 当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数.但是, ...

  7. PHP类实例教程(七):析构函数与PHP的垃圾回收

    析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行. GC (Garbage Collector) 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾.PHP会将其在内存中销毁.这是PHP ...

  8. Arm开发板+Qt学习之路-析构函数和对话框一起时

    先记录一下代码 一:先将指针释放掉,在显示对话框 void MainWindow::canResponseError(SendCanMsgThread *sendCanMsgThread ){ std ...

  9. C++ 析构函数与内存池

    2019独角兽企业重金招聘Python工程师标准>>> C++ Primer 书中也提到编写 class 时要注意 copy control 成员(拷贝构造函数,赋值操作符,析构函数 ...

最新文章

  1. 可视化日历(Java实现)
  2. Linux上创建一个用户,并给该用户指定目录的权限,修改时区
  3. 使用Pitcher简化卫语句
  4. [vue] vue在组件中引入插件的方法有哪些?
  5. Font Configuration and Customization for Open Source Systems - 白皮书翻译和深入
  6. iOS之app审核遭遇5.2.1的条例被拒
  7. scoped_ref
  8. Java多线程-join方法
  9. 【hdu2815-Mod Tree】高次同余方程-拓展BadyStepGaintStep
  10. 5款Windows 界面原型设计工具
  11. Android端,如何实现Youtube or YouTube music后台或锁屏状态下,播放音乐和视频
  12. NS3入门:第一个程序first.cc
  13. 用C语言打印简单图案(爱心\圆形\三角形等)
  14. 计算机网络CiscoPacket Tracer实验
  15. 斐波拉契数列 Java三种实现
  16. 卫片图斑_推进土地卫片图斑整治工作
  17. 【BZOJ4545】DQS的trie
  18. C加加中的数组与指针-基础语法
  19. MIMO OFDM 系统常用信号检测算法
  20. jdk17下载安装(Windows)

热门文章

  1. x86包含高性能服务器吗,高性能x86服务器被认为最适合虚拟化
  2. 数据中心综合布线-高密度模块化角型配线架
  3. iPhone 11忘记密码怎么办?四种方法
  4. centos7安装python3.x(多种方式)
  5. emscripten的安装
  6. 动态规划1:状态转移方程-求最大子序列和
  7. 解决uni-app开发的view页面中的文本乱码问题
  8. 什么是shell,用途是什么?
  9. 强化学习(四) - 无模型学习(MC、TDL)
  10. 基于几何中位数的通道剪枝——Filter Pruning via Geometric Median