c++ - 使用 Boost 库时如何在 C++ 中覆盖 new?

标签 c++ boost operator-overloading new-operator delete-operator

我已经为我的项目覆盖了全局的新建和删除运算符,但我无法使其全部与 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/

相关文章:

java - Java编译器如何实现二元运算符

c++ - 将 vector<Derived*> 转换为 vector<Base*> 时如何避免复制

c++ - 删除运算符,它们等同于 C++ 中的析构函数

c++ - 查找float类型的内存格式

c++ - Boost Shared Memory - 指针的返回 vector

c++ - 从父类调用基类重载运算符

prolog - 在 Prolog 中重新定义 AND 运算符

c++ - 与直接初始化和复制初始化混淆

c++ - boost::filesystem::path.parent_path() 和空格

c++ - 为什么 regex_match 与我的正则表达式不匹配?