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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-04-11 c语言 ZwQuerySystemInformation查看进程信息