【问题标题】:How can custom allocator know if a pointer points to an array?自定义分配器如何知道指针是否指向数组?
【发布时间】:2016-07-25 13:21:01
【问题描述】:

我可能对分配器的一些概念有误解。但是我真的不知道为什么我们需要一个std::size_t 的参数来传递给allocate 来表示要分配的对象的数量。参数是否用于分配内存区域,如数组或向量?

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

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

【问题讨论】:

标签: c++ allocator


【解决方案1】:

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

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

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

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

【讨论】:

  • 我的错,因此在传递给 STL 容器时会发生可怕的内存泄漏。我确实将签名写为void deallocate(pointer ptr, std::size_t dummy=1) :-\Thanks
【解决方案2】:

假设您在这里谈论 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() 调用的第一个参数;否则,行为未定义。

【讨论】:

  • 我在这里看不到任何保证。您需要传递使用 allocate 创建的相同指针,并且需要传递正确的大小,否则它是 UB。
  • @NathanOliver 我认为他们指的是标准容器提供的保证:如果您为std::vector 创建自定义分配器,那么std::vector 将始终(理论上)尊重您的合同分配器并使用与allocate 中相同的pn 调用deallocate
  • @KABoissonneault 啊。这是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多