c++ - 为什么这个 C++ STL 分配器不分配?

标签 c++ stl allocation

我正在尝试编写一个从 std::allocator 派生的自定义 STL 分配器,但不知何故,所有对 allocate() 的调用都转到了基类。我已将其缩小到以下代码:

template <typename T> class a : public std::allocator<T> {
public:
    T* allocate(size_t n, const void* hint = 0) const {
        cout << "yo!";
        return 0;
    }
};

int main()
{
    vector<int, a<int>> v(1000, 42);
    return 0;
}

我期待“哟!”打印出来,然后是一些可怕的错误,因为我实际上并没有分配任何东西。相反,该程序运行良好并且什么也不打印。我做错了什么?

我在 gcc 和 VS2008 中得到相同的结果。

最佳答案

您将需要提供重新绑定(bind)成员模板和 C++ 标准的分配器要求中列出的其他内容。例如,您需要一个模板复制构造函数,它不仅接受 allocator<T>还有allocator<U> .例如,一个代码可能会这样做,例如 std::list 可能会这样做

template<typename Allocator>
void alloc1chunk(Allocator const& alloc) {
    typename Allocator::template rebind<
        wrapper<typename Allocator::value_type>
      >::other ot(alloc);
    // ...
}

如果不存在正确的重新绑定(bind)模板,或者不存在相应的复制构造函数,则代码将失败。猜测需求是什么,您将毫无用处。迟早您将不得不处理依赖于这些分配器要求的一部分的代码,并且代码将失败,因为您的分配器违反了它们。我建议您在 20.1.5 中的标准拷贝的一些工作草案中查看它们.

关于c++ - 为什么这个 C++ STL 分配器不分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/539628/

相关文章:

c++ - 具有多重容器 C++ 11 的类的析构函数

c++ - 无法找到并替换 vector 的所有出现

c++ - 我可以通常/总是使用 std::forward 而不是 std::move 吗?

c++ - `iterator` 和 `const_iterator` 不是 STL 容器的必需成员吗?

python内存分配跟踪

c++11 - C++11中有没有更好的方法在堆栈上构造类

c++ - 空悬挂指针 C++

c++ - STL map 在删除第一对后不会添加一对

c++ - std::transform() 和 toupper(),没有匹配的函数

检查字符串是否未分配