自定义分配器如何知道指针是否指向数组?

时间:2016-07-25 13:21:01

标签: c++ allocator

我可能误解了有关分配器的一些概念。但我真的不知道为什么我们需要将std::size_t的参数传递给allocate以指示要分配的对象数。参数是用于分配像数组或向量的内存区域吗?

如果它们是,那么我的自定义分配器如何知道先前返回的指针是指向某个区域还是仅指向某个对象?我的分配器是否有责任记录这些指针?

如果他们不是,那么为什么我们需要这个论点?

2 个答案:

答案 0 :(得分:5)

allocator_traits<YourAllocator<T>>::allocate应为类型为T的N个对象的连续序列分配内存。 N由size_t参数提供。

  

如果是,那么我的自定义分配器如何知道先前返回的指针是指向某个区域还是仅指向某个对象?

“先前返回的指针”是什么?

您的分配器将被告知何时分配以及何时解除分配内存。解除分配时,it will be told what N was for the allocation that is being deallocated。你的分配器不需要跟踪任何指针。

答案 1 :(得分:0)

假设你在这里谈论std :: allocator。文档很清楚:

  

T* std::allocator::allocate(std::size_t n);

     

分配未初始化存储的n * sizeof(T)字节[...]

所以问题的答案是:是的,该参数用于分配数组或向量等内存区域。

对于您的后续问题:不,您不需要跟踪返回的指针,因为std::allocator::deallocate保证使用与n相同的std::allocator::allocate进行调用是为了任何返回的指针。

  

void std::allocator::deallocate( T* p, std::size_t n );

     

释放指针p引用的存储,该存储必须是先前调用allocate()获得的指针。   参数n必须等于最初生成p的allocate()调用的第一个参数;否则,行为未定义。