替换标准C ++分配器?

时间:2012-11-07 05:45:15

标签: c++ allocator

我想用更健壮的分配器替换标准分配器(C ++标准只需要对vector :: resize进行溢出检查)。在进行负面自我测试时,随着许多库提供的各种C ++分配器都会落在他们的脸上。

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

有没有一种标准的方法来替换程序中使用的C ++分配器而不需要太多努力?我还想确保在库代码中替换它,我可能无法访问源代码。

3 个答案:

答案 0 :(得分:4)

在C ++ 0x中,在命名空间mystd中定义一个新的模板别名,该别名是std::vector但是使用自定义分配器。将所有std::vector替换为mystd::vector。摆脱代码中的所有using namespace stdusing std::vector

重建。将您使用原始vector<T>的地点替换为mystd::vector<T>

哦,使用比mystd更好的名字。

答案 1 :(得分:4)

如果要在全局范围内而不是按容器修改分配,则可能需要替换::operator new::operator delete。可以想象,你也想要替换::operator new[]::operator delete[] - 但这些只用于分配数组,你几乎不应该使用它们(除非它不明显:不,这些用于为std::vector分配内存,尽管它在某些方面与数组非常相似。)

虽然禁止尝试更换库的大部分内容,但该标准明确允许替换这些内容。

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

答案 2 :(得分:4)

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

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