[英]Is it possible to perform callbacks to the global operators `new` and `delete`?
[英]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 new
、 operator delete
),因為如果您願意的話,這兩個函數的聲明已經硬編碼到語言中。 但是,名稱std
、 std::bad_alloc
和std::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.