• C++ new到底new什么


    VS2010-Debug版本
     1 9: int *obj = new int(6);
     2 00F714CE push 4 //压栈
     3 00F714D0 call operator new (0F711EAh) //调用new函数返回分配的地址addr --- 0F711EAh是指令 jmp operator new 的地址
     4 00F714D5 add esp,4 //恢复栈
     5 00F714D8 mov dword ptr [ebp-0F8h],eax //把返回的地址addr赋给起始地址为ebp-0F8h的内存空间
     6 00F714DE cmp dword ptr [ebp-0F8h],0 //判断分配是否成功
     7 00F714E5 je main+51h (0F71501h)  //如果不成功跳往0x0F71501h   
     8 00F714E7 mov eax,dword ptr [ebp-0F8h] //起始地址为ebp-0F8h 的内存空间(addr)赋值给eax
     9 00F714ED mov dword ptr [eax],6 //把以起始地址为eax的内存空间(addr)置成6
    10 00F714F3 mov ecx,dword ptr [ebp-0F8h] //起始地址为ebp-0F8h 的内存空间(addr)赋值给ecx
    11 00F714F9 mov dword ptr [ebp-100h],ecx //ecx的值(addr)赋给起始地址为ebp-100h的内存空间
    12 00F714FF jmp main+5Bh (0F7150Bh) //无条件跳转到0x0F7150B
    13 00F71501 mov dword ptr [ebp-100h],0 //起始地址为ebp-100h的内存空间置为0---分配失败的情况
    14 00F7150B mov edx,dword ptr [ebp-100h] //起始地址为ebp-100h的内存空间(addr)赋值给edx
    15 00F71511 mov dword ptr [obj],edx  //把edx的内容(addr)赋值给obj为起始地址的内存空间a
    16 10: delete obj;
    17 00F71514 mov eax,dword ptr [obj]  //把obj为起始地址的内存空间送往eax
    18 00F71517 mov dword ptr [ebp-0ECh],eax //eax送往以ebp-0ECh为起始地址的内存空间
    19 00F7151D mov ecx,dword ptr [ebp-0ECh]  //以ebp-0ECh为起始地址的内存空间送往ecx
    20 00F71523 push ecx //ecx压栈
    21 00F71524 call operator delete (0F710A0h)
    22 00F71529 add esp,4  
    23 11:int *obj2 = new int(7);
    24 与分配obj相同
     此时输出*obj,会得到“7”。
    why? obj本来是指向分配的地址addr_obj, 删除操作就是删除掉addr_obj中的内容,释放addr_obj内存,但是obj本身还是指向它的
    当我们给obj2分配空间时,new函数会返回第一个可用的地址,也就是刚才释放的addr_obj,此时obj仍然指向该地址,所以得到上述结果。
    这样做虽然偶尔会正确,但是后患无穷!!!
     
     
    addr的经过的地方
    eax -> ptr [ebp-0F8h] -> ecx ->  ptr [ebp-100h] -> edx -> ptr[obj]
     
    new函数所要做的
    1. 调用对象的构造函数,分配空间,返回地址addr
    2. 把返回的地址addr赋值给指针对象
  • 相关阅读:
    Windows 上运行 Zookeeper
    【Kubernetes】K8S的默认调度策略--如何保证POD调度按照提交顺序进行?
    rabbitmq crashdump分析
    java.sql.SQLRecoverableException: IO Error: SO Exception was generated
    常见的数据分析模型
    事实表设计
    PHP系列 | PHP curl报错:417
    工具系列 | Ubuntu18.04安装Openssl-1.1.1
    PHP系列 | PHP中使用gRPC extension 扩展安装
    云原生之容器安全实践
  • 原文地址:https://www.cnblogs.com/rain-lei/p/3616362.html
Copyright © 2020-2023  润新知