C ++ new: What is new?
9: int * obj = new int (6); 00F714CE push 4 // pressure stack 00F714D0 call operator new (0F711EAh) // call the new function to return the allocated address addr --- 0F711EAh is the address of the command jmp operator new 00F714D5 add esp, 4 // restore stack 00F714D8 mov dword ptr [ebp-0F8h], eax // assign the returned address addr to the memory space 00F714DE cmp dword ptr starting address for the ebp-0F8h [ebp-0F8h], 0 // determine whether the allocation is successful 00F714E5 je main + 51 h (0F71501h) // if it fails to jump to 0x0F71501h 00F714E7 mov eax, dword ptr [ebp-0F8h] // The starting address is the memory space of the ebp-0F8h (addr) assigned to eax00F714ED mov dword ptr [eax], 6 // set the memory space (addr) with the starting address eax to 600F714F3 mov ecx, dword ptr [ebp-0F8h] // the memory space (addr) with the starting address as the ebp-0F8h) assign the value to ecx00F714F9 mov dword ptr [ebp-100h], the value of ecx // ecx (addr) is assigned to the memory space 00F714FF jmp main + 5Bh (0F7150Bh) from the starting address to the ebp-100h) // unconditionally jump to 0x0F7150B00F71501 mov dword ptr [ebp-100h], 0 // the memory space starting from the address for the ebp-100h is set to 0 --- the allocation Failure Case 00F7150B mov edx, dword ptr [ebp-100h] // The starting address is the memory space of the ebp-100h (addr) assigned to edx00F71511 mov dword ptr [obj], edx // set the content of edx (addr) the memory space a10: delete obj; 00F71514 mov eax, dword ptr [obj] // send the memory space of obj as the starting address to eax00F71517 mov dword ptr [ebp-0ECh], eax // eax sends to memory space 00F7151D mov ecx with ebp-0ECh as the starting address, dword ptr [ebp-0ECh] // the memory space starting with ebp-0ECh is sent to ecx00F71523 push ecx // ecx press stack 00F71524 call operator delete (0F710A0h) 00F71529 add esp, 4 11: int * obj2 = new int (7); same as the allocated obj
* Obj is output, and "7" is returned ". Why? Obj is originally directed to the allocated address addr_obj. The delete operation is to delete the content in addr_obj and release the addr_obj memory. However, obj itself points to it. When we allocate space to obj2, the new function returns the first available address, that is, the released addr_obj. At this time, obj still points to this address, so the above result is obtained. Although this may happen occasionally, it is always possible !!!
Addr's pathEax-> ptr [ebp-0F8h]-> ecx-> ptr [ebp-100h]-> edx-> ptr [obj]
What to do with the new function1. Call the object constructor to allocate space. The return address addr2. assign the returned address addr to the pointer object.