2016-08-02 90 views
3

假設我正在使用std::allocator編寫自定義矢量來包裝newdelete如何使用std :: allocator代替realloc?

當元素的數量超過向量的容量時,我想重新分配緩衝區到更大的值。我可以通過撥打realloc()輕鬆實現。我不想這樣做,因爲我認爲分配/釋放的責任應該駐留在分配器中。

然而,看std::allocator的界面,我不明白我怎麼可以做一個重新分配。只有對的方法:

T* allocate(std::size_t n); 
void deallocate(T* p, std::size_t n); 

我應該打電話allocator::allocate然後allocator::deallocate而不只是realloc?這是否有效?它一定是std::vector正在做的。爲什麼std::allocator不提供reallocate功能?

+1

_「爲什麼std :: allocator不提供重新分配函數?」_這在某種程度上在[這個問題]中被覆蓋了(http://stackoverflow.com/questions/3105001/why-is-there-no-reallocation -Functionality-在-C-分配器?RQ = 1)。 – ArchbishopOfBanterbury

+0

[FYI] https://isocpp.org/wiki/faq/freestore-mgmt#realloc-and-renew – NathanOliver

+1

@NathanOliver它結束時指出「在C++中,處理重新分配的更好方法是使用標準庫容器,如矢量,並讓它自然地增長。「,這是這個問題的出發點... ... –

回答

4

比方說,我正在寫一個自定義向量使用std :: allocator來包裝新的和刪除。

在一般情況下(不包括POD的專業化),我認爲你不能在任何情況下使用realloc。構造在特定內存位置的任意對象可能具有內部指針,這些內部指針指向與其構建地址相關的非常特定的地址。簡單地移動它(以字節複製的方式)可能會破壞不變量。

因此,您提到的替代方法通常是必需的。你將不得不分配一個新的數組,move(或可能甚至copy!)對象到新的位置,然後釋放舊數組。當然,這包括不止一個階段,可能會失敗 - 另一個原因,你爲什麼不能在一般情況下真的reallocate。也許這就是分配器在第一種情況下從未擁有過這種功能的原因 - 對於基於數組的容器,你通常不能真正使用它們(儘管你可能可以將它們用於POD專業化)。