2011-02-24 69 views
2

是否可以對超載運營商的新增和刪除設置一些限制? 我的重載新文件與另一個文件鏈接到我的測試程序。限制超載新增和刪除

的情況是:

if(condition is satisfied) 
    call overloaded new 
else 
    call the actual new defined in new.h 
+0

它是一個過載(即一個不同的簽名,需要使用放置新語法進行調用)或替換(即與要調用的版本相同的簽名)。 – AProgrammer 2011-02-24 15:47:17

+0

@STATUS_ACCESS_DENIED,我只是加了它...... – AProgrammer 2011-02-24 15:47:45

+0

@AProgrammer:啊,好的:) – 0xC0000022L 2011-02-24 15:48:53

回答

0

有三種方法可以提供新操作員。

  • 替換一個或多個的四個非放置默認運營商新的,

  • 到缺省操作者新的(因此與一個附加的參數,這些可與放置新的語法稱爲)提供過載,

  • 爲操作者提供新的類成員,這些將只用於類和它們的後代被調用。

在後兩種情況下,可以調用新的語法更清楚地知道運營商之一:

ptr = ::operator new(sz); 
ptr = ::operator new[](sz); 
ptr = ::operator new(sz, std::nothrow); 
ptr = ::operator new[](sz, std::nothrow); 

,但如果你已經取代了他們,你的替換將被調用。 你不能調用你已經替換的默認運算符(也許你可以通過玩特定的實現鏈接器技巧,但這超出了語言的範圍)。

關於更換運營商新:

  • 應更換兩個運營商新和對應的兩個運營商刪除在一起(或delete運算符的一個可以用意想不到的指針很容易地調用)
  • 你應該將兩個運算符new []和相應的兩個運算符delete []一起替換(相同的原因)
  • 請注意新處理程序可能會發生什麼,某些庫會使用該處理程序。
3

始終使用重載new/delete,並檢查其執行內部的狀況。

+0

可以檢查條件,但如果它是假的,如何返回到原來的新?我的意思是new.h中的新東西? – kingsmasher1 2011-02-25 05:25:14

+0

@ Kingmasher1:看看我的回答:沒有新的魔法。 – Patrick 2011-02-25 09:48:36

1

一旦你更換了默認的::operator new()你不能再使用它了 - 它已經永遠消失了。 See this question

如果你想有原::operator new()的效果,你就必須重新實現它這是不是很辛苦。

0

您可以輕鬆地在重載的新操作員中執行檢查。確保實施新操作員的所有風格(正如AProgrammer已經指出的那樣)。

調用原始/默認新是不可能的,但它並不難實現它自己。畢竟,新只分配內存,就是這樣。因此,您可以調用malloc,HeapAlloc或系統上找到的任何內存分配例程,而不是調用原始/默認的new。一定要在執行刪除時調用相應的內存釋放方法(free,HeapFree,...)。

你沒有告訴你要檢查你的實施新的條件?如果它是一個'靜態'條件(我的意思是:在執行應用程序時總是給出相同的結果),同樣的條件也應該添加到你的刪除實現中。

如果條件取決於運行應用程序時的情況和更改,則應該預見一種方法,您可以知道要在刪除功能中使用哪個刪除實現。一個竅門做,這是以下幾點:

在你實施新:

  • 分配8個字節比請求更多的(必須是8個字節,以保持對齊正確)在第一
  • 填充8個字節的識別,這樣就可以知道哪些潛在的內存分配函數,你用
  • 添加8個字節分配的指針,並返回這個

在你我中刪除mplementation:

  • 減去8個字節給你
  • 檢查在該地點發現的標識指針(見新)看你應該調用哪一種底層刪除,執行