【问题标题】:How to override new in C++ when using the Boost libraries?使用 Boost 库时如何在 C++ 中覆盖 new?
【发布时间】: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


【解决方案1】:

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

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

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

不要定义名为 new 的宏。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-11
    • 2014-11-07
    • 2015-01-19
    • 1970-01-01
    • 2013-05-08
    • 2011-03-02
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多