我可能误解了有关分配器的一些概念。但我真的不知道为什么我们需要将std::size_t
的参数传递给allocate
以指示要分配的对象数。参数是用于分配像数组或向量的内存区域吗?
如果它们是,那么我的自定义分配器如何知道先前返回的指针是指向某个区域还是仅指向某个对象?我的分配器是否有责任记录这些指针?
如果他们不是,那么为什么我们需要这个论点?
答案 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()调用的第一个参数;否则,行为未定义。