簡體   English   中英

C ++容器和右側

[英]C++ Containers and right hand side

今天,我讀到您不應該將STL容器用於auto_ptr,因為auto_ptr會在=運算符中刪除它的rhs值。

所以我有兩個問題:

1)這是否意味着不應在容器中使用具有此行為的所有類?

2)您可以使用哪種容器?

1)這是否意味着不應在容器中使用具有此行為的所有類?

的確是這樣,因為那是不正確的復制行為,因為此后復制並不等於源,而是破壞了源。 在C ++ 11之前,這是移動語義的一個殘破實現,這對於std::auto_ptr的嚴格唯一所有權語義是必需的。

2)您可以使用哪種容器?

真正的答案實際上是,具有這種行為(復制構造函數/賦值會破壞其源代碼)的類不應該存在。 幸運的是,由於C ++ 11具有適當的移動語義,因此如今已不再需要它,它可以安全地准確地實現此破壞性副本(簡而言之,僅當確實不再需要該源時)。

因此,不推薦使用std::auto_ptr ,並且不應再使用它。 它已被std::unique_ptr取代,該std::unique_ptr可移動但不可復制。 但是由於C ++ 11容器寧願在適當的時候移動它們的元素而不是復制它們,因此std::unique_ptr可以在標准容器內完美使用。 您只是不能復制容器或用單個對象填充容器,而這將需要std::unique_ptr的副本,但是這些操作無論如何都不會起作用,因為它們在概念上對於唯一所有權語義是錯誤的。

附帶說明一下,如果您實際上出於某種原因選擇了std:auto_ptr ,那就是您想要唯一的所有權語義,那么std::shared_ptr (如其他答案所建議的那樣)便是錯誤的,因為它表現出共享所有權。 std::unique_ptr是今天的std::auto_ptr 絕對不要發送垃圾郵件std::shared_ptr ,其中std::unique_ptr (甚至是原始指針,但從您的問題我可以排除該選項)是合適的。

自動指針具有非常嚴格的所有權:它並且僅對它所指向的對象的生命周期負責。 如果復制auto_ptr ,則會丟失對其指向的引用。

問題在於STL容器的工作方式。 例如,當您添加一個元素時,容器可能會擴展以獲取更多的內存,從而導致將所有值復制到新的內存中,從而導致丟失auto_ptrs。

認為關聯容器在分配額外的內存時可能不會完全復制自身,但是我絕對不確定,如果有人可以確認它,請發表評論,或者只是編輯我的答案。 無論如何,您最好不要冒險。

另請注意,自C ++ 0x起已棄用Auto_ptr ,建議改用unique_ptr 在您的情況下, std::shared_ptr可能會解決問題,除非您確實確實需要這些對象的唯一所有權。

究竟。 通常,序列容器元素必須是CopyConstructible和Assignable。 這意味着他們需要:

  • 公共副本構造函數
  • 公共任務運營商

關聯容器(set <>和map <>)也必須提供嚴格的弱排序,即必須定義operator < (或專用比較功能)。

C ++標准的第23.1章提供了詳細要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM