例如,來自的std ::雙端隊列::運算=在C++參考:
(1)複印分配(常量的std ::雙端隊列&其他)
分配器感知容器分配如何實現?
替換內容與其他的內容的副本。
如果 std :: allocator_traits :: propagate_on_container_copy_assignment()爲 爲true,則目標分配器將被替換爲源 分配器的副本。如果目標分配器和源分配器不相比 相等,則使用目標(* this)分配器來釋放內存,然後使用其他分配器在複製 元素之前分配它。
如果this->get_allocator() == other.get_allocator()
,我可以簡單地破壞,並在需要解除分配this
'元素,或分配,如果需要,構造元件,或者如果需要的話從other
的元素複製分配給*this
。
但是,如果不是?上面的報價是否意味着我不能複製 - 分配元素,因此我必須先使用this->get_allocator()
銷燬和釋放所有元素,然後使用other.get_allocator()
分配和構造元素?
但是,如果是這樣的話,爲什麼我應該使用other.get_allocator()
進行分配?
以後會不會導致一些運行時錯誤,因爲this
不會正確釋放內存?
(2)移動分配(標準::雙端隊列& &其他)
替換內容與其他 使用移動語義的(即,在其它的數據是從其它移動進入 這個容器)。之後其他人處於有效但未明確的狀態。 如果 std :: allocator_traits :: propagate_on_container_move_assignment() 爲true,則目標分配器將被替換爲源 分配器的副本。如果它是假的,並且源和目標分配器的比較不等於 ,則目標無法獲取源內存的所有權,並且必須單獨移動 - 分配每個元素,根據需要使用其自己的分配程序分配額外的內存。在任何情況下,原來存在於*的所有 元素都將被銷燬,或者通過元素移動賦值來替換 。
如果this->get_allocator() == other.get_allocator()
,這是一件容易的事。
但是,如果沒有,上面的問題也會出現,除非在這種情況下使用移動分配。
在這兩種情況下,我還有一個問題。
如果這些元素既不能被複制分配也不能被移動分配,那麼可以銷燬它並從其他構造中構建它們嗎?如果是,我應該使用其分配器?
什麼非POCCA分配器?我是否必須隨時使用'this-> get_allocator()'? –
嗯,是的,如果你需要分配。 –