上一个标题:“我必须更换全球运营商new和delete改变内存分配策略中的第三方代码吗?”
简单地说:我们需要替换第三方库内存分配技术,无需改变它的源代码。
很长的故事:
考虑内存限制的应用程序,使得庞大的动态分配(也许是,几乎所有可用的系统内存)。 我们使用专门的分配器,到处都使用它们( shared_ptr
的,容器等)。 我们有在我们的应用程序分配内存的每一个字节总量控制和功率。
此外,我们需要对第三方助手库链接。 那个讨厌的家伙使得一些标准的方式分配,使用默认的运营商new
, new[]
delete
和delete[]
或malloc
或别的东西,非标准(让我们一概而论说我们不知道这个库如何管理它的堆分配)。
如果这个辅助库使得分配是足够大的,我们可以得到HDD颠簸,内存碎片和路线问题,出内存不足bad_alloc
S和各种各样的问题。
我们不能(或不愿)来改变库的源代码。
第一次尝试:
我们从来没有过这样邪恶的“黑客”,在发布之前建立。 与压倒一切的操作者首先测试new
不同之处在于,做工精细,:
- 我们不知道什么陷阱等待我们的未来(这是可怕的)
- 我们的用户(甚至我们的分配器)现在必须分配我们做同样的方式
问题:
- 是否有办法挂钩这些分配没有超载全球运营商? (仅限本地LIB-挂钩?)
- ...如果我们不知道它到底是什么用途:
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(); void* operator new[] (std::size_t size, void* ptr) throw(); void operator delete (void* ptr) throw(); void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw(); void operator delete (void* ptr, void* voidptr2) throw(); void operator delete[] (void* ptr) throw(); void operator delete[] (void* ptr, const std::nothrow_t& nothrow_constant) throw(); void operator delete[] (void* ptr, void* voidptr2) throw();
不同的东西,如果该库是动态的?
编辑#1
跨平台的解决方案是优选的(如果可能看起来不太可能)。 如果不是这样,我们的主要平台:
- 的Windows 86/64(MSVC 10)
- 于Linux x86 / 64(GCC 4.6)
编辑#2
近2年过去了,几个操作系统和编译器版本已经进化了,所以我很好奇,如果有这方面的一些新的和未知? 任何标准的建议? OS-具体情况如何? 黑客? 你怎么写内存渴应用的今天? 请分享你的经验。