从汇编看c++中参数对象和局部对象的析构顺序
作者:网络转载 发布时间:[ 2013/5/29 10:02:50 ] 推荐标签:
下面是f函数的汇编码:
?f@@YAXVX@@@ZPROC ; f
; 9 : void f(X x) {
push ebp
mov ebp, esp
sub esp, 8;为局部对象x1预留8byte的空间
; 10 : X x1;
; 11 : x.i = 1;
mov DWORD PTR _x$[ebp], 1;把1写给参数对象首地址处,即把1写入参数对象的成员变量i
; 12 : x.j = 2;
mov DWORD PTR _x$[ebp+4], 2;把2写入偏移参数对象首地址4byte处的内存,即把2写入参数对象的成员变量j
; 13 :
; 14 : }
lea ecx, DWORD PTR _x1$[ebp];将局部变量x1的首地址给ecx
call ??1X@@QAE@XZ ; 为x1调用析构函数
lea ecx, DWORD PTR _x$[ebp];将参数对象的首地址给ecx
call ??1X@@QAE@XZ ; 为参数对象调用析构函数
mov esp, ebp
pop ebp
ret 0
?f@@YAXVX@@@Z ENDP ; f
; Function compile flags: /Odtp
_TEXT ENDS
; COMDAT ??1X@@QAE@XZ
_TEXT SEGMENT
_this$ = -4 ; size = 4
??1X@@QAE@XZPROC ; X::~X, COMDAT
; _this$ = ecx
; 6 : ~X() {}
push ebp
mov ebp, esp
push ecx
mov DWORD PTR _this$[ebp], ecx
mov esp, ebp
pop ebp
ret 0
??1X@@QAE@XZ ENDP
从上面的代码可以看出,参数对象和局部对象都是在函数退出之前调用析构函数。并且参数对象在局部对象调用析构函数之后再调用自己的析构函数。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11