首页  >  文章  >  后端开发  >  如何在大型代码库中普遍覆盖全局“new”和“delete”运算符?

如何在大型代码库中普遍覆盖全局“new”和“delete”运算符?

Barbara Streisand
Barbara Streisand原创
2024-11-03 13:08:02660浏览

How to Universally Override Global `new` and `delete` Operators in Large Codebases?

有效覆盖全局新建和删除运算符

问题:

替换全局新建和删除运算符删除运算符使用自定义内存管理在大规模代码库中提出了挑战。在每个文件中包含包含重载的头文件是不切实际的。如何确保这些重载得到普遍采用?

解决方案:

重写 new 和 delete 运算符是在链接时完成的过程。通过创建一个单独的翻译单元 (TU) 来定义运算符并将其链接到项目中,可以全局替换默认运算符,而无需修改现有代码库。

代码示例:

以下是定义 new 和 delete 运算符的 TU 示例:

<code class="cpp">// optional_ops.cpp

void * operator new(std::size_t n) throw(std::bad_alloc)
{
  //...
}

void operator delete(void * p) throw()
{
  //...
}</code>

包括 不需要标头,因为运算符 new 和运算符删除的声明已硬编码到语言中。但是,可能需要声明 std、std::bad_alloc 和 std::size_t 等名称。

C 11 及更高版本的替代方案:

C 11引入了一种更简单的方法来定义新的重载,使用 decltype(sizeof(0)) 来确定 size 参数的类型:

<code class="cpp">void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
  //...
}</code>

以上是如何在大型代码库中普遍覆盖全局“new”和“delete”运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn