簡體   English   中英

C ++清除類析構函數中的std :: struct結構列表

[英]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::vectorstd::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.

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