上一个标题:"我必须替换全局运算符new和delete以更改第三方代码中的内存分配策略吗?"
简短的故事: 我们需要在不改变源代码的情况下替换第三方库中的内存分配技术.
很长的故事:
考虑使用大量动态分配的内存绑定应用程序(可能是几乎所有可用的系统内存).我们使用专门的分配器,并在任何地方使用它们(shared_ptr容器等).我们对应用程序中分配的每个字节内存都有完全的控制和功能.
此外,我们需要链接第三方帮助程序库.那个讨厌的家伙使得分配在一些标准的方法,使用默认的运营商new,new[],delete和delete[]或malloc或别的东西非标准(让我们一概而论说我们不知道这个库如何管理它的堆分配).
如果这个帮助程序库进行足够大的分配,我们可能会出现硬盘抖动,内存碎片和对齐问题,内存bad_alloc不足以及各种问题.
我们不能(或不想)更改库源代码.
第一次尝试:
我们之前从未在发布版本中遇到过这种不圣洁的"hack".使用覆盖运算符的第一次测试new工作正常,但以下情况除外:
问题:
malloc或者new?此签名列表是否完整?(并且没有其他事情我们必须实施):
void* operator new (std::size_t size) throw (std::bad_alloc);
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
void* operator new (std::size_t size, void* ptr) throw();
void* operator new[] (std::size_t size) throw (std::bad_alloc);
void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value) throw(); …Run Code Online (Sandbox Code Playgroud)