7

我想用更健壮的分配器替换标准分配器(C++ 标准只需要对 vector::resize 进行溢出检查)。许多库提供的各种 C++ 分配器在接受否定的自测时会面目全非。

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

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

4

3 回答 3

6

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

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

于 2012-11-08T22:58:13.633 回答
5

如果您想在全局而不是每个容器上修改分配,您可能需要替换::operator newand ::operator delete。可以想象,您还想替换::operator new[]and ::operator delete[]——但这些仅用于分配数组,无论如何您几乎都不应该使用它们(此外,以防不明显:不,这些用于分配内存对于 a std::vector,尽管它在某些方面与数组非常相似)。

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

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

于 2012-11-07T07:14:42.887 回答
3

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

重建。将您使用 raw 的地方替换vector<T>mystd::vector<T>.

哦,使用比 . 更好的名称mystd

于 2012-11-07T06:09:47.137 回答