【发布时间】:2012-08-21 02:54:03
【问题描述】:
我已经为我的项目覆盖了全局 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 库,但仍能获得内存分配跟踪?
【问题讨论】:
-
我认为修改 Boost 可能比处理这个烂摊子容易得多。毕竟,它是开源的,而且只有标头。
-
@Mehrdad 升级呢?
-
@curiousguy:升级后重新应用您的更改...并不难。差异/补丁或正则表达式可能会起作用(不确定正则表达式是否有效,但值得一试)。
-
@Mehrdad 是的,但是……这似乎有风险。只有在绝对需要时,我才会这样做。 (例如,纠正某些库中的错误。)
-
“烦人的习惯”是因为
operator new与 new-expression 有不同的行为,有时,尤其是在低级库代码中,这就是您需要的行为。您会在标准库实现中找到相同的“习惯”,因为分配器使用operator new分配原始内存。
标签: c++ boost operator-overloading new-operator delete-operator