2

我已经为我的项目覆盖了全局 new 和 delete 运算符,但是我无法让它与 Boost 库一起使用。我在这里实现了解决方案:Macro to replace C++ operator new以解决我遇到的多个重载问题。但是,Boost 库有一个恼人的习惯,即使用operator new而不是简单地使用new离开预处理器进行扩展:

::operator new(n);

至:

::operator (__file__ = "someFile.cpp", __line__ = 123) && 0 ? NULL : new(n);

是否可以编写另一个宏来删除这些“不需要的”扩展?例如,我尝试编写:

#define (operator (file, line) && 0 ? NULL :) operator new

但显然宏的标识符部分不允许使用括号。如何使用 Boost 库,但仍能获得内存分配跟踪?

4

1 回答 1

1

一个好的答案取决于你需要它来做什么但显然它是为了减少调试所花费的时间(通过了解哪些块被分配到哪里的信息)。

然后,首先,减少调试分配和释放所花费时间的最佳通用方法是使用智能指针,例如std::shared_ptr. 让智能指针自动正确地管理您的释放。这可以真正减少调试所花费的时间。

也就是说,获取所需信息的一种方法是明确说明。在您的代码中,编写 egTRACKING_NEW而不是仅仅new, innew表达式。然后TRACKING_NEW相应地定义。

不要定义一个名为new.

除了形式上的问题(如果你在此之后包含任何标准标题,你就有 UB),几乎可以保证你会陷入困境。TRACKING_NEW因此,如果您发现在更改代码以使用智能指针后仍然需要它,请进行定义。但不要定义一个名为new.

于 2012-08-21T03:56:15.213 回答