2016-07-25 42 views
4

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

如果他们是,那么我的自定义分配器如何知道以前返回的指针是指向一个区域还是仅指向一个对象?我的分配器负责保存这些指针的记录吗?

如果他们不是,那么我们为什么需要这种说法?

+0

这有帮助吗? http://en.cppreference.com/w/cpp/memory/allocator/allocate – NathanOliver

回答

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。你的分配器不需要跟踪任何指针。

+0

我的不好,并且因为传递给STL容器时出现了可怕的内存泄漏。我没有写签名为'void deallocate(pointer ptr,std :: size_t dummy = 1)': - \ Thanks – YiFei

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所引用的存储,这必须是指向由先前调用获得的分配()。 参数n必须等于最初产生p的调用allocate()的第一个参数;否则,行为是不确定的。

+0

我在这里没有看到任何保证。您需要传递使用allocate创建的相同指针,并且您需要传递正确的大小,否则它是UB。 – NathanOliver

+0

@NathanOliver我认为他们指的是标准容器提供的保证:如果你正在为'std :: vector'创建一个自定义分配器,那么'std :: vector'将总是(理论上)尊重你的分配器的契约并使用'allocate'中使用的'p'和'n'调用'deallocate'。 – KABoissonneault

+0

@KABoissonneault啊。这就说得通了。 – NathanOliver