new的實現並模擬大多數編譯器new失敗機制

2021-09-30 17:28:20 字數 2203 閱讀 7704

new的實現以及模擬set_new_handler機制

typedef void(*new_handler)( );

class x

;new_handler x::currenthandler = 0;

new_handler x::set_new_handler(new_handler p)

void* x::operator new(size_t size)

while (1)

}

重點是operator new

幾乎很多現代的編譯器預設都會這麼做:

當我們int *p = new int[0];我們發現竟然成功。這是因為我們new預設如果引數是0的話,會以最小值分配

所以有

if(size= 0)

好了,當我們new分配到記憶體時,會返回我們分配的指標

void* result = malloc(size);

if(result !=null)

returnresult;//開闢成功,直接返回

我們這裡主要想說的是分配失敗時,究竟編譯器會做什麼工作?

第一種情況:若然我們設定了set_new_handler函式,那麼如何分配記憶體失敗,就會去執行set_new_handler設定了的函式

我們可以看看set_new_handler大致是怎麼實現的

new_handlerx::set_new_handler(new_handlerp)

這個函式大致就是把新的設定進去,而把舊的返回出去,方便我們**

回到operator new**

new_handlerglobalhandler = set_new_handler(0);//把原先的儲存

set_new_handler(globalhandler);

if(globalhandler)

(*globalhandler)();

else

throwstd::bad_alloc();

我們先獲取set_new_handler裡面的函式指標

去判斷這個指標是否為null

若不為null,那就即是我們設定了set_new_handler

那麼就去執行我們的set_new_handler

一般來說,set_new_handler該做的就是把一些我們沒用的free掉,然後重新地去malloc

所以這裡被寫成了while(1)

第二種情況:

我們根本就沒有設定set_new_handler

那麼operator new就會丟擲乙個標準庫的異常std::bad_alloc();

所以,我們若然丟擲std::bad_alloc();而我們又不去處理,那麼將會引出乙個bug

就是程式直接就死掉了

所以,我們應該在不同情況下去靈活地處理不同的事件

第一種方法:set_new_handler

第二種方法:try catch

第三種方法:過載operator new,過載我們的new操作(這個操作可移植性最高,因為stl在不同編譯環境下都不同)

JavaScript 模擬new的實現

首先一句話解釋一下new new 可以實現乙個物件繼承建構函式的屬性以及方法 舉個例子 function parent name,age parent.prototype.sayname function let child new parent js 18 console.log child.na...

模擬new的簡單實現

在建構函式中建立乙個空物件 把建構函式的this指向這個新的空物件 把建構函式的prototype屬性指向的原型物件賦值給這個空物件的 proto 屬性 返回這個空物件 function person name,age function newsimulate 這裡是為了呼叫shift方法,該方法會...

模擬實現js的new

目錄new是什麼 一句話介紹new new運算子建立乙個使用者自定義的物件型別的例項,或者具有建構函式的內建物件型別之一。看下下面的 來了解new操作符都做了什麼事情 class constructor function person name,age 每個函式都有prototype物件屬性 在類的...