【发布时间】:2016-07-25 13:21:01
【问题描述】:
我可能对分配器的一些概念有误解。但是我真的不知道为什么我们需要一个std::size_t 的参数来传递给allocate 来表示要分配的对象的数量。参数是否用于分配内存区域,如数组或向量?
如果是,那么我的自定义分配器如何知道先前返回的指针是指向一个区域还是只是一个对象?我的分配器是否负责记录这些指针?
如果不是,那我们为什么需要这个论点?
【问题讨论】:
我可能对分配器的一些概念有误解。但是我真的不知道为什么我们需要一个std::size_t 的参数来传递给allocate 来表示要分配的对象的数量。参数是否用于分配内存区域,如数组或向量?
如果是,那么我的自定义分配器如何知道先前返回的指针是指向一个区域还是只是一个对象?我的分配器是否负责记录这些指针?
如果不是,那我们为什么需要这个论点?
【问题讨论】:
allocator_traits<YourAllocator<T>>::allocate 应该为T 类型的 N 个对象的连续序列分配内存。 N 由size_t 参数提供。
如果是,那么我的自定义分配器如何知道先前返回的指针是指向一个区域还是只是一个对象?
什么“先前返回的指针”?
您的分配器将被告知何时分配以及何时释放内存。当释放发生时,it will be told what N was for the allocation that is being deallocated。您的分配器不需要跟踪任何指针。
【讨论】:
void deallocate(pointer ptr, std::size_t dummy=1) :-\Thanks
假设您在这里谈论 std::allocator 。文档很清楚:
T* std::allocator::allocate(std::size_t n);分配 n * sizeof(T) 字节的未初始化存储 [...]
所以您的问题的答案是:是的,该参数用于分配内存区域,如数组或向量。
对于您的后续问题:不,您不需要跟踪返回的指针,因为保证std::allocator::deallocate 被调用时使用与std::allocator::allocate 相同的n 用于任何返回指针。
void std::allocator::deallocate( T* p, std::size_t n );释放指针 p 引用的存储空间,它必须是通过先前调用 allocate() 获得的指针。 参数 n 必须等于最初产生 p 的 allocate() 调用的第一个参数;否则,行为未定义。
【讨论】:
std::vector 创建自定义分配器,那么std::vector 将始终(理论上)尊重您的合同分配器并使用与allocate 中相同的p 和n 调用deallocate。