[英]C++ Clearing std::list of structs in class destructor
如果我維護定義的結構ABC的std::list
(不指向所述結構的指針)作為class P
的類變量,並手動將push_back ABC變量填充到類P的各種成員函數中。
我仍然需要在類的析構函數中執行list :: clear()嗎? 從堆棧中刪除/刪除該類的對象后,列表中的結構是否仍會刪除?
如果我維護指向這些結構的智能指針的列表,是否會更有效(每次推回可能/可能不涉及復制-因為我們只是將指針存儲在列表中)?
至於list::clear()
的需要,請參閱其他答案。 我應該補充一點,如果ABC
的析構函數沒有其他明確的工作要做,您可以忽略它,編譯器會自動為您生成它。
至於填充列表的方式。 您要避免大數據的深層副本。 這可以通過移動來實現
std::list<ABC> list;
ABC big(data_needed_for_constructing_ABC);
list.push_back(std::move(big));
提供的class ABC
具有高效的move構造函數(如果其內存管理使用標准功能(例如std::vector
或std::unique_ptr
,則可能是自動的))。
您也可以將新列表元素直接構建到列表中
std::list<ABC> list;
list.emplace_back(data_needed_for_constructing_ABC);
當沒有臨時物體ABC big
時。
最后,如果您不能有效地移動對象,並且希望將對象的另一個副本放置在其他地方,則可以考慮使用std::list<std::shared_ptr<ABC>>
。 但是,這只有在沒有明確所有權的情況下才有意義。
您不需要明確地清除呼叫。 std::list
的析構函數將自動執行。
切換到指針對性能的好壞取決於您的ABC
數據類型的大小。 如果容量很大,則復制成本很高。 在這種情況下,避免復制會提高性能。 另一方面,如果對象較小,則最好復制它們。
如果您的類包含一個列表作為數據成員,則當該類的對象被銷毀時,將自動調用std::list
的析構函數,這將依次銷毀其所有元素。
您無需在類的析構函數中clear
調用其方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.