返回使用自定义分配器的向量

时间:2016-10-10 15:28:39

标签: c++ vector stl allocator

假设您开发了一个要与std::vector一起使用的优化自定义分配器(例如,对于小分配,自定义分配器从堆栈而不是堆中获取内存,比如std::string的SSO;或者它在Windows上使用例如VirtualAlloc分配大块内存,然后从一个块内部分割单个分配,只是增加一个指针)。

typedef std::vector<T, OptimizedAllocator<T>> OptimizedVector;

如何在从函数返回向量的上下文中使用它,比如这个?

OptimizedVector DoSomething() 
{
    OptimizedVector<int>::allocator_type alloc{};
    OptimizedVector<int> v{alloc};

    // Do stuff...

    return v;
} 

在函数范围的末尾,分配器对象被销毁,因此返回的向量可能包含垃圾,对吗?

另一种方法可能是将allocator对象作为参考传递给每个函数作为附加参数,但这有点难看......

有没有办法在向量中安全“嵌入”分配器对象?

你如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

分配器必须是CopyConstructible而没有异常,之后a1 == a2必须保持(意味着它们共享相同的内存池)。我强烈建议您阅读this page on the Allocator concept

std::vector存储您提供的分配器的副本。

因此,如果您正确实施分配器以便安全复制,那么您的代码就没有问题。

答案 1 :(得分:2)

分配器按照标准的定义保存:

  

n4140§23.2.1[container.requirements.general] / 8

     

除非另有说明,否则本条款中定义的所有容器   使用分配器获取内存[...]此分配器的副本是   用于执行任何内存分配[...]

vector未“另行指定”。

这也意味着你的分配器应该支持复制,如果它需要状态,它可能是真正的分配器的句柄。

答案 2 :(得分:0)

来自here

  

容器保留alloc的内部副本,该副本用于为其元素分配和释放存储,以及构造和销毁它们(由其allocator_traits指定)。

所以,如果我没错,你要求的是默认值。