• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 深入c++中临时对象的析构时机的详解

深入c++中临时对象的析构时机的详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++面向对象,c++面向对象编程题,c++面向对象教程,c++面向对象程序设计,c++类与对象等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源;而具名对象则是与创建的顺序相反,依次调用析构函数。

c++源码:

int main() {
    X x1;
    X();
    x1.i = 1;
    X x2;

   
}
</div>
对应的汇编码:

; 11   : int main() {

    push    ebp
    mov    ebp, esp
    sub    esp, 24                    ; 为x1 临时对象 x2预留24byte空间

; 12   :     X x1;

    lea    ecx, DWORD PTR _x1$[ebp];获取x1对象的首地址,作为隐含参数传入构造函数
    call    ??0X@@QAE@XZ                ; 为x1调用构造函数

; 13   :     X();

    lea    ecx, DWORD PTR $T2559[ebp];获取临时对象首地址,作为隐含参数传入构造函数
    call    ??0X@@QAE@XZ                ; 为临时对象调用构造函数
    lea    ecx, DWORD PTR $T2559[ebp];获取临时对象首地址,作为隐含参数传入析构函数
    call    ??1X@@QAE@XZ                ; 为临时对象调用析构函数

; 14   :     x1.i = 1;

    mov    DWORD PTR _x1$[ebp], 1;将1写给x1首地址处内存,即将1写入x1中的成员变量i中

; 15   :     X x2;

    lea    ecx, DWORD PTR _x2$[ebp];获取x2的首地址,作为隐含参数传入构造函数
    call    ??0X@@QAE@XZ                ; 为x2调用构造函数

; 16   :    
; 17   :    
; 18   : }

    lea    ecx, DWORD PTR _x2$[ebp];获取x2的首地址,作为隐含参数传入析构函数
    call    ??1X@@QAE@XZ                ; 为x2调用析构函数
    lea    ecx, DWORD PTR _x1$[ebp];获取x1的首地址,作为隐含参数传入析构函数
    call    ??1X@@QAE@XZ                ; 为x1调用析构函数
    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
</div>
从上面的汇编码可以看出,临时对象确实是在不需要之后就调用了析构函数,尽管它在x2对象之前被创建,但依然在x2对象之前被析构。而x1 x2析构函数调用顺序,是与他们构造函数的调用顺序相反。

再看下面的情况:

c++中的源码:


int main() {
    X x1;
    X(), x1.i = 1;//这里有一条逗号运算符
    X x2;
}
</div>
这里,改造临时对象之后,有一个逗号表达式,而不是分号。

下面是汇编码:

    push    ebp
    mov    ebp, esp
    sub    esp, 36                    ; 为x1 临时对象 x2预留36字节的空间

; 13   :     X x1;

    lea    ecx, DWORD PTR _x1$[ebp];获取x1的的首地址,作为隐含参数传递给构造函数
    call    ??0X@@QAE@XZ                ; 为x1调用构造函数

; 14   :     X(), x1.i = 1;//这里有一条逗号运算符

    lea    ecx, DWORD PTR $T2560[ebp];获取临时对象的首地址,作为隐含参数传递给构造函数
    call    ??0X@@QAE@XZ                ; 为临时对象调用构造函数
    mov    DWORD PTR _x1$[ebp], 1;将1赋给x1首地址处的内存,即给x1的成员变量i赋值1
    lea    ecx, DWORD PTR $T2560[ebp];获取临时变量的首地址,作为隐含参数传递给析构函数
    call    ??1X@@QAE@XZ                ; 为临时对象调用析构函数

; 15   :     X x2;

    lea    ecx, DWORD PTR _x2$[ebp];获取x2的首地址,作为隐含参数传递给构造函数
    call    ??0X@@QAE@XZ                ; 为x2调用构造函数

; 16   : }

    lea    ecx, DWORD PTR _x2$[ebp];获取x2的首地址,作为隐含参数传递给析构函数
    call    ??1X@@QAE@XZ                ; 为x2调用析构函数
    lea    ecx, DWORD PTR _x1$[ebp];获取x1的首地址,作为隐含参数传递给析构函数
    call    ??1X@@QAE@XZ                ; 为x1调用析构函数
    xor    eax, eax
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
</div>
可以看到,与第一次不同的是,临时对象构造完毕之后,并没有立即调用析构函数,而是执行了逗号后面的赋值语句后,才调用的析构函数。

综上所述:

临时对象调用析构函数的时机是一条高级语言执行完毕的时候,而一条高级语言执行完毕的标志是分号。所以,临时对象调用析构函数的时机是碰到分号的时候

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++对象的浅复制和深复制详解及简单实例
  • 用C++面向对象的方式动态加载so的方法
  • C++对象内存分布详解(包括字节对齐和虚函数表)
  • 如何应用C++的函数对象
  • 剖析C++的面向对象编程思想
  • C++内核对象封装单实例启动程序的类
  • C++中的常对象与常对象成员详解
  • C++对象的动态建立与释放详解
  • C++临时性对象的生命周期详细解析
  • 深入c++中临时对象的析构时机的详解

相关文章

  • 2017-05-28C++类的静态成员初始化详细讲解
  • 2017-05-28C++实现简单的学生管理系统
  • 2017-05-28C++空类详解
  • 2017-05-28编写C++程序使DirectShow进行视频捕捉
  • 2017-05-28C语言实现魔方阵算法(幻方阵 奇魔方 单偶魔方实现)
  • 2017-05-28C++实现简单的扫雷游戏(控制台版)
  • 2017-05-28VC++角色游戏中的人物初始化模块代码实例
  • 2017-05-28解析如何用指针实现整型数据的加法
  • 2017-05-28C++多态的实现机制深入理解
  • 2017-05-28详细解析C语言中的开方实现

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++设计模式之解释器模式
    • 详解散列表算法与其相关的C语言实现
    • 用位图排序无重复数据集实例代码(C++版)
    • C++ 冒泡排序数据结构、算法及改进算法
    • C语言new操作的安全性分析
    • 用C++类实现单向链表的增删查和反转操作方法
    • c++ int转string方法
    • 用c语言根据可变参数合成字符串的实现代码
    • 详解C++中的对象指针与对象数组
    • Windows进程崩溃问题的定位方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有