C new到底new什麼

2022-08-21 10:09:15 字數 2090 閱讀 2212

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

1610: 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

2311: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賦值給指標物件

c new 與new 的區別

new和delete運算子用於動態分配和撤銷記憶體的運算子 new用法 1.開闢單變數位址空間 1 new int 開闢乙個存放陣列的儲存空間,返回乙個指向該儲存空間的位址.int a new int 即為將乙個int型別的位址賦值給整型指標a.2 int a new int 5 作用同上,但是同時...

js中的new 到底做了些什麼??

new在執行時會做四件事情 new會在記憶體中建立乙個新的空物件 new 會讓this指向這個新的物件 執行建構函式 目的 給這個新物件加屬性和方法 new會返回這個新物件基於上面的講解,我們執行如下 var obj new base new操作符具體幹了什麼呢?其實很簡單,就幹了三件事情。var ...

js中new操作符到底幹了什麼?

先看乙個例子 function person person.prototype.test function let p1 newperson console.log p1.name andy console.log p1.age 20 p1.say hello everybody p1.test t...