簡體   English   中英

如何正確替換全局新建和刪除運算符

[英]How to properly replace global new & delete operators

首先,至少有 4-5 個主題與 SO 上的主題相似。 我閱讀了其中的每一個,但我覺得它們並沒有真正幫助我解決這個特定問題。 如果其他人發現重復的問題,我深表歉意。 在發布這個之前,我已經完成了我的搜索,因為這似乎是一個非常常見的問題。

我在 Windows 7 上使用 Visual Studio .NET 2003。

我有自己的 new/delete 重載,指向我自己對 malloc() 和 free() 的自定義調用以進行診斷。 我的新/刪除重載位於我已包含在幾個文件中的頭文件中。

問題是,代碼庫幾乎像意大利面條一樣,沒有簡單的方法來確保所有東西都使用這些重載。 有包含到第三方庫的黑盒。 我們也到處使用 STL。

在我的測試中,我發現 STL 仍在混合調用我自己的 new/delete 和標准的 MSVC new/delete 調用。

將我的頭文件包含在數以千計的其他文件中似乎不太現實,那只會花費太長時間。 任何人都可以提供一些關於如何在全局范圍內正確有效地重載 new/delete 以便一切都使用我的自定義內存管理器的提示嗎?

這不是它的工作原理。 替換兩個運算符,這是在鏈接時完成的。 您需要做的就是編寫一個定義這些運算符的 TU 並將其鏈接到組合中。 沒有人需要知道這一點:

// optional_ops.cpp

void * operator new(std::size_t n) throw(std::bad_alloc)
{
  //...
}
void operator delete(void * p) throw()
{
  //...
}

原則上,不需要任何頭文件來聲明這些函數( operator newoperator delete ),因為如果您願意的話,這兩個函數的聲明已經硬編碼到語言中。 但是,名稱stdstd::bad_allocstd::size_t預先聲明,因此您可能希望包含<new>或其他一些標頭來提供這些名稱。

在 C++11 及更高版本中,您也可以使用decltype(sizeof(0))以不需要任何類型的庫的方式獲取第一個參數的大小。 C++11 還有一個更簡單的異常模型,沒有動態異常規范(最終在 C++17 中完全從語言中刪除)。

void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
  //...
}

還添加這些行:

void *operator new[](std::size_t s) throw(std::bad_alloc)
{
    // TODO: implement
    return NULL;
}
void operator delete[](void *p) throw()
{
    // TODO: implement
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM