我已经为我的项目覆盖了全局的新建和删除运算符,但我无法使其全部与 Boost 库一起使用。我在这里实现了解决方案:Macro to replace C++ operator new解决我遇到的多个重载问题。然而,Boost 库有一个恼人的习惯,即使用 operator new
而不是简单地使用 new
让预处理器扩展:
::operator new(n);
到:
::operator (__file__ = "someFile.cpp", __line__ = 123) && 0 ? NULL : 新(n);
是否可以编写另一个宏来删除这些“不需要的”扩展?例如,我试着写:
#define (operator (file, line) && 0 ? NULL :) operator new
但显然在宏的标识符部分不允许使用括号。如何使用 Boost 库,但仍能跟踪我的内存分配情况?
最佳答案
一个好的答案取决于您 需要什么,但显然这是为了减少调试所花费的时间(通过了解哪些 block 分配在哪里的信息)。
然后,首先,减少调试分配和释放所花费时间的最佳通用方法是使用智能指针,例如std::shared_ptr
。让智能指针自动正确地管理您的重新分配。这确实可以减少调试时间。
也就是说,获取所需信息的一种方法是明确。在您的代码中,编写例如TRACKING_NEW
而不是 new
,在 new
表达式中。然后相应地定义 TRACKING_NEW
。
不要定义名为 new
的宏。
除了形式上的问题(如果你在之后包含任何标准标题,你就有 UB),它几乎可以保证让你陷入困境。所以,请定义例如TRACKING_NEW
如果你发现改代码后还是需要使用智能指针。但不要定义名为 new
的宏。
关于c++ - 使用 Boost 库时如何在 C++ 中覆盖 new?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12047871/