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)的分支迅速定位并得到构造函数的范围

posted @ 2022-04-11 21:10  乘舟凉  阅读(35)  评论(0)    收藏  举报