2016-07-25 105 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