替换标准 C++ 分配器?

jww*_*jww 7 c++ allocator

我想用更健壮的分配器替换标准分配器(C++ 标准只需要对 vector::resize 进行溢出检查)。许多库随附的各种 C++ 分配器在接受负面自测时表现不佳。

我可以使用更强大的分配器。ESAPI 的分配器不仅检查溢出,它还具有调试工具来帮助发现错误。http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/esapi/util/zAllocator.h

是否有一种标准方法可以轻松替换程序中使用的 C++ 分配器?我还想确保它在库代码中被替换,我可能无法访问源代码。

Jon*_*ely 6

malloc可以被具有相同签名的另一个函数替换的库函数不同的是,std::allocator类模板和模板代码根据需要被实例化并内联到使用它的代码中。一些标准库代码已经被编译到库的目标文件中,并且将包含std::allocator 无法替换的实例化代码。所以唯一的方法是如果标准库提供了一些非标准的方法来替换它的std::allocator. 幸运的是,GCC 的 libstdc++ 允许您这样做,允许您选择std::allocator配置和构建 GCC 时使用的实现,有几个不同的选择

将 ESAPI 分配器作为选项之一添加到 GCC 源,然后重建 GCC 以使用该分配器作为std::allocator提供其实现的基类并不会太多工作。您可能需要稍微调整 ESAPI 分配器代码,并可能更改 libstdc++configure脚本以允许您说--enable-libstdcxx-allocator=esapi


Jer*_*fin 5

如果要在全局基础上而不是按容器修改分配,则可能需要替换::operator new::operator delete。可以想象,您还想替换::operator new[]并且::operator delete[]- 但这些仅用于分配数组,无论如何您几乎永远不应该使用它(除此之外,以防不明显:不,这些用于分配内存for a std::vector,尽管它在某些方面与数组非常相似)。

尽管禁止尝试替换库的大部分部分,但该标准明确允许替换这些部分。

当然,如果有人已经为特定容器指定了不同的分配器,并且该分配器(最终)没有通过::operator new(or ::operator new[])获取其内存,这不会影响该容器/那些容器。