VS2010-Debug版本
int *obj = new int(6); 00F714CE push 00F714D0 call (0F711EAh) 00F714D5 add esp, 00F714D8 mov dword ptr [ebp-0F8h],eax 00F714DE cmp dword ptr [ebp-0F8h], 00F714E5 je main+51h (0F71501h) 00F714E7 mov eax,dword ptr [ebp-0F8h] 00F714ED mov dword ptr [eax], 00F714F3 mov ecx,dword ptr [ebp-0F8h] 00F714F9 mov dword ptr [ebp-100h],ecx 00F714FF jmp main+5Bh (0F7150Bh) 00F71501 mov dword ptr [ebp-100h], 00F7150B mov edx,dword ptr [ebp-100h] 00F71511 mov dword ptr [obj],edx 00F71514 mov eax,dword ptr [obj] 00F71517 mov dword ptr [ebp-0ECh],eax 00F7151D mov ecx,dword ptr [ebp-0ECh] 00F71523 push ecx 00F71524 call 00F71529 add esp, 與分配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]