是否可以對超載運營商的新增和刪除設置一些限制? 我的重載新文件與另一個文件鏈接到我的測試程序。限制超載新增和刪除
的情況是:
if(condition is satisfied)
call overloaded new
else
call the actual new defined in new.h
是否可以對超載運營商的新增和刪除設置一些限制? 我的重載新文件與另一個文件鏈接到我的測試程序。限制超載新增和刪除
的情況是:
if(condition is satisfied)
call overloaded new
else
call the actual new defined in new.h
有三種方法可以提供新操作員。
替換一個或多個的四個非放置默認運營商新的,
到缺省操作者新的(因此與一個附加的參數,這些可與放置新的語法稱爲)提供過載,
爲操作者提供新的類成員,這些將只用於類和它們的後代被調用。
在後兩種情況下,可以調用新的語法更清楚地知道運營商之一:
ptr = ::operator new(sz);
ptr = ::operator new[](sz);
ptr = ::operator new(sz, std::nothrow);
ptr = ::operator new[](sz, std::nothrow);
,但如果你已經取代了他們,你的替換將被調用。 你不能調用你已經替換的默認運算符(也許你可以通過玩特定的實現鏈接器技巧,但這超出了語言的範圍)。
關於更換運營商新:
始終使用重載new
/delete
,並檢查其執行內部的狀況。
可以檢查條件,但如果它是假的,如何返回到原來的新?我的意思是new.h中的新東西? – kingsmasher1 2011-02-25 05:25:14
@ Kingmasher1:看看我的回答:沒有新的魔法。 – Patrick 2011-02-25 09:48:36
一旦你更換了默認的::operator new()
你不能再使用它了 - 它已經永遠消失了。 See this question。
如果你想有原::operator new()
的效果,你就必須重新實現它這是不是很辛苦。
您可以輕鬆地在重載的新操作員中執行檢查。確保實施新操作員的所有風格(正如AProgrammer已經指出的那樣)。
調用原始/默認新是不可能的,但它並不難實現它自己。畢竟,新只分配內存,就是這樣。因此,您可以調用malloc,HeapAlloc或系統上找到的任何內存分配例程,而不是調用原始/默認的new。一定要在執行刪除時調用相應的內存釋放方法(free,HeapFree,...)。
你沒有告訴你要檢查你的實施新的條件?如果它是一個'靜態'條件(我的意思是:在執行應用程序時總是給出相同的結果),同樣的條件也應該添加到你的刪除實現中。
如果條件取決於運行應用程序時的情況和更改,則應該預見一種方法,您可以知道要在刪除功能中使用哪個刪除實現。一個竅門做,這是以下幾點:
在你實施新:
在你我中刪除mplementation:
它是一個過載(即一個不同的簽名,需要使用放置新語法進行調用)或替換(即與要調用的版本相同的簽名)。 – AProgrammer 2011-02-24 15:47:17
@STATUS_ACCESS_DENIED,我只是加了它...... – AProgrammer 2011-02-24 15:47:45
@AProgrammer:啊,好的:) – 0xC0000022L 2011-02-24 15:48:53