花开堪折直须折,莫待无花空折枝。|

园龄:粉丝:关注:

2022-04-11 21:10阅读: 30评论: 0推荐: 0

release vs 在汇编中堆对象如何确定构造函数的范围

release vs 在汇编中堆对象如何确定构造函数的范围

#include <stdio.h>

class Person {
public:
  Person() {
    age = 20;
  }
 virtual int  getAge(){
	return this->age;
 }
  int age;
};

int main(int argc, char* argv[]) {
  Person *p = new Person;
  //为了突出本节讨论的问题,这里没有检查new运算的返回值
  printf("%d\n", p->age);
  return 0;
}

汇编

.text:0000000140001020                 sub     rsp, 28h
.text:0000000140001024                 mov     ecx, 10h        ; Size
.text:0000000140001029                 call    ??2@YAPEAX_K@Z  ; operator new(unsigned __int64)
.text:000000014000102E                 test    rax, rax
.text:0000000140001031                 jz      short IF_END_140001044
.text:0000000140001033                 lea     rcx, ??_7Person@@6B@ ; const Person::`vftable'
.text:000000014000103A                 mov     dword ptr [rax+8], 20
.text:0000000140001041                 mov     [rax], rcx
.text:0000000140001044
.text:0000000140001044 IF_END_140001044:                       ; CODE XREF: main+11↑j
.text:0000000140001044                 mov     edx, [rax+8]
.text:0000000140001047                 lea     rcx, aD         ; "%d\n"
.text:000000014000104E                 call    _printf
.text:0000000140001053                 xor     eax, eax
.text:0000000140001055                 add     rsp, 28h
.text:0000000140001059                 retn
.text:0000000140001059 main            endp

在上面看到在new了内存后有一个单分支结构,判断内存是否申请成功,以此来决定要不要执行构造函数

找到new运算后,可立即在下文中寻找判定new返回值的代码,在判定成功(new的返回值非0)的分支迅速定位并得到构造函数的范围

本文作者:乘舟凉

本文链接:https://www.cnblogs.com/czlnb/p/16132085.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   乘舟凉  阅读(30)  评论(0编辑  收藏  举报
历史上的今天:
2021-04-11 c语言 ZwQuerySystemInformation查看进程信息
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起