程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ new到底new什麼,到底new

C++ new到底new什麼,到底new

編輯:C++入門知識

C++ new到底new什麼,到底new


9: int *obj = new int(6);
00F714CE push 4 //壓棧
00F714D0 call operator new (0F711EAh) //調用new函數返回分配的地址addr --- 0F711EAh是指令 jmp operator new 的地址
00F714D5 add esp,4 //恢復棧
00F714D8 mov dword ptr [ebp-0F8h],eax //把返回的地址addr賦給起始地址為ebp-0F8h的內存空間
00F714DE cmp dword ptr [ebp-0F8h],0 //判斷分配是否成功
00F714E5 je main+51h (0F71501h)  //如果不成功跳往0x0F71501h   
00F714E7 mov eax,dword ptr [ebp-0F8h] //起始地址為ebp-0F8h 的內存空間(addr)賦值給eax
00F714ED mov dword ptr [eax],6 //把以起始地址為eax的內存空間(addr)置成6
00F714F3 mov ecx,dword ptr [ebp-0F8h] //起始地址為ebp-0F8h 的內存空間(addr)賦值給ecx
00F714F9 mov dword ptr [ebp-100h],ecx //ecx的值(addr)賦給起始地址為ebp-100h的內存空間
00F714FF jmp main+5Bh (0F7150Bh) //無條件跳轉到0x0F7150B
00F71501 mov dword ptr [ebp-100h],0 //起始地址為ebp-100h的內存空間置為0---分配失敗的情況
00F7150B mov edx,dword ptr [ebp-100h] //起始地址為ebp-100h的內存空間(addr)賦值給edx
00F71511 mov dword ptr [obj],edx  //把edx的內容(addr)賦值給obj為起始地址的內存空間a
10: delete obj;
00F71514 mov eax,dword ptr [obj]  //把obj為起始地址的內存空間送往eax
00F71517 mov dword ptr [ebp-0ECh],eax //eax送往以ebp-0ECh為起始地址的內存空間
00F7151D mov ecx,dword ptr [ebp-0ECh]  //以ebp-0ECh為起始地址的內存空間送往ecx
00F71523 push ecx //ecx壓棧
00F71524 call operator delete (0F710A0h)
00F71529 add esp,4  
11:int *obj2 = new int(7);
與分配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賦值給指針對象

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved