2015-02-24 227 views
0

unique_ptr<list<Struct>>list<unique_ptr<Struct>>之間有什麼區別? list<unique_ptr<Struct>>是否會導致元素的內存自動管理?Unique_ptr容器或unique_ptr元素

+2

第一個是指向列表的指針,第二個是指針列表。第二種常用於多態對象(「Struct」是基類?),第一種很奇怪。 – milleniumbug 2015-02-24 03:00:35

+0

是的,我明白這一部分。我主要關心的是內存分配在這兩種情況下的工作方式。第一種將堆棧或堆中的元素分配給哪一個?第二個很明顯,元素在堆上,列表管理信息在堆棧上。第一個呢? – 2015-02-24 03:08:17

+0

@SidharthMudgal:兩者都會在堆上分配元素;這是標準容器的功能。在第一種情況下,列表結構本身也在堆上,這很奇怪。在第二個中,每個堆分配元素都是一個指向另一個堆分配對象的指針。除非由於某種原因(如多態)需要額外的間接尋址,否則應該是'list '。或更可能'矢量'。 – 2015-02-24 03:17:55

回答

1
  • 最明顯的區別是,你必須在施工點定義list<unique_ptr<Struct>>,而當你構建unique_ptr<list<Struct>>它可以只是一個nullptr
  • list<unique_ptr<Struct>>具有存儲所有指針
  • unique_ptr<list<Struct>>的可以忽略不計的開銷在獲取任何成員時會有開銷

堆和unique_ptr<list<Struct>>上的兩個存儲數據都稍小在堆棧上。

2

說​​就像是說*,但有自動刪除的額外好處。

unique_ptr<list<Struct>>list<unique_ptr<Struct>>之間的差異與list<Struct>*list<Struct*>之間的差值完全相同。即,一個是指向的list的指針,另一個是指向Struct的指針的list。這是一個相當明顯的主要區別。

list類型管理自己的內容,儘可能多地爲列表節點分配內存,該列表節點包含放置在<>中的內容。因此,list<Struct>中的節點直接保存了一個Struct對象。但是list<Struct*>中的節點只保存指向該結構的指針。

通過邏輯擴展,list<unique_ptr<Struct>>中的節點保存unique_ptr<Struct>,它指向已分別分配的Struct。相反,unique_ptr<list<Struct>>是一個指向list的指針,其節點是直接持有的Struct s。

list的管理內容不對不能由包裝它的指針處理。這是對管理執行的地方的一個混淆:list直接管理它的內容 - 一個列表,並且unique_ptr直接管理它的內容 - 一個原始指針 - 沒有別的。