自定义分配器如何知道指针是否指向数组?
How can custom allocator know if a pointer points to an array?
我可能对分配器的某些概念有误解。但是我真的不知道为什么我们需要传递一个std::size_t
的参数给allocate
来表示要分配的对象数量。参数是否用于分配内存区域,如数组或向量?
如果它们是,那么我的自定义分配器如何知道先前返回的指针是指向一个区域还是指向一个对象?我的分配器是否负责记录这些指针?
如果它们不是,那我们为什么需要那个参数?
allocator_traits<YourAllocator<T>>::allocate
应为 T
类型的连续 N 个对象序列分配内存。 N 由 size_t
参数提供。
If they are, then how can my custom allocator know if the previously returned pointer points to a region or just an object?
什么"previously returned pointer"?
您的分配器将被告知何时分配以及何时解除分配 内存。当释放发生时,it will be told what N was for the allocation that is being deallocated。您的分配器不需要跟踪任何指针。
假设您在这里谈论 std::allocator。文档非常清楚:
T* std::allocator::allocate(std::size_t n);
Allocates n * sizeof(T) bytes of uninitialized storage [...]
所以你的问题的答案是:是的,参数用于分配内存区域,如数组或向量。
对于您的后续问题:不,您不需要跟踪返回的指针,因为 std::allocator::deallocate
保证会使用与 [=13] 相同的 n
进行调用=] 用于任何返回的指针。
void std::allocator::deallocate( T* p, std::size_t n );
Deallocates the storage referenced by the pointer p, which must be a pointer obtained by an earlier call to allocate().
The argument n must be equal to the first argument of the call to allocate() that originally produced p; otherwise, the behavior is undefined.
我可能对分配器的某些概念有误解。但是我真的不知道为什么我们需要传递一个std::size_t
的参数给allocate
来表示要分配的对象数量。参数是否用于分配内存区域,如数组或向量?
如果它们是,那么我的自定义分配器如何知道先前返回的指针是指向一个区域还是指向一个对象?我的分配器是否负责记录这些指针?
如果它们不是,那我们为什么需要那个参数?
allocator_traits<YourAllocator<T>>::allocate
应为 T
类型的连续 N 个对象序列分配内存。 N 由 size_t
参数提供。
If they are, then how can my custom allocator know if the previously returned pointer points to a region or just an object?
什么"previously returned pointer"?
您的分配器将被告知何时分配以及何时解除分配 内存。当释放发生时,it will be told what N was for the allocation that is being deallocated。您的分配器不需要跟踪任何指针。
假设您在这里谈论 std::allocator。文档非常清楚:
T* std::allocator::allocate(std::size_t n);
Allocates n * sizeof(T) bytes of uninitialized storage [...]
所以你的问题的答案是:是的,参数用于分配内存区域,如数组或向量。
对于您的后续问题:不,您不需要跟踪返回的指针,因为 std::allocator::deallocate
保证会使用与 [=13] 相同的 n
进行调用=] 用于任何返回的指针。
void std::allocator::deallocate( T* p, std::size_t n );
Deallocates the storage referenced by the pointer p, which must be a pointer obtained by an earlier call to allocate(). The argument n must be equal to the first argument of the call to allocate() that originally produced p; otherwise, the behavior is undefined.