gpt4 book ai didi

C++ 清除类析构函数中的 std::list 结构

转载 作者:行者123 更新时间:2023-11-30 01:46:12 26 4
gpt4 key购买 nike

如果我将定义的结构 ABC(不是指向所述结构的指针)的 std::list 维护为 class P 中的类变量,并手动 push_back ABC 变量填充在类 P 的各种成员函数中。

  • 我还需要在类的析构函数中执行 list::clear() 吗?当该类的对象从堆栈中删除/移除时,列表中的结构是否会被删除?

  • 如果我维护一个指向所述结构的智能指针列表(每次推回可能/可能不涉及复制 - 因为我们只是将指针存储在列表中),是否会更有效率?

最佳答案

至于需要 list::clear()查看其他答案。我应该补充一点,如果 ABC 的析构函数没有其他明确的工作要做,您可以忽略它,编译器会自动为您生成它。

关于填充列表的方式。您希望避免大数据的深拷贝。这可以通过 moving 来实现

std::list<ABC> list;
ABC big(data_needed_for_constructing_ABC);
list.push_back(std::move(big));

提供class ABC有一个高效的移动构造函数(如果它的内存管理使用标准功能,如 std::vectorstd::unique_ptr ,它可能是自动的)。

您也可以将新的列表元素直接构建到列表中

std::list<ABC> list;
list.emplace_back(data_needed_for_constructing_ABC);

当没有临时对象时ABC big曾经存在过。

最后,如果您不能有效地移动对象,并且想在其他地方拥有该对象的另一个拷贝,您可以考虑 std::list<std::shared_ptr<ABC>> .但是,只有在没有明确所有权的情况下,这才是明智的。

关于C++ 清除类析构函数中的 std::list 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com